diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/put/PutRepositoryRequest.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/put/PutRepositoryRequest.java index 83beb0016a972..a06175a598bf2 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/put/PutRepositoryRequest.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/repositories/put/PutRepositoryRequest.java @@ -22,22 +22,20 @@ import org.elasticsearch.ElasticsearchGenerationException; import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.support.master.AcknowledgedRequest; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.settings.Settings; 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 java.io.IOException; import java.util.Map; import static org.elasticsearch.action.ValidateActions.addValidationError; -import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS; import static org.elasticsearch.common.settings.Settings.readSettingsFromStream; import static org.elasticsearch.common.settings.Settings.writeSettingsToStream; +import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS; /** * Register repository request. @@ -198,18 +196,8 @@ public boolean verify() { * * @param repositoryDefinition repository definition */ - public PutRepositoryRequest source(XContentBuilder repositoryDefinition) { - return source(repositoryDefinition.bytes()); - } - - /** - * Parses repository definition. - * - * @param repositoryDefinition repository definition - */ - public PutRepositoryRequest source(Map repositoryDefinition) { - Map source = repositoryDefinition; - for (Map.Entry entry : source.entrySet()) { + public PutRepositoryRequest source(Map repositoryDefinition) { + for (Map.Entry entry : repositoryDefinition.entrySet()) { String name = entry.getKey(); if (name.equals("type")) { type(entry.getValue().toString()); @@ -217,64 +205,14 @@ public PutRepositoryRequest source(Map repositoryDefinition) { if (!(entry.getValue() instanceof Map)) { throw new IllegalArgumentException("Malformed settings section, should include an inner object"); } - settings((Map) entry.getValue()); + @SuppressWarnings("unchecked") + Map sub = (Map) entry.getValue(); + settings(sub); } } return this; } - /** - * Parses repository definition. - * JSON, Smile and YAML formats are supported - * - * @param repositoryDefinition repository definition - */ - public PutRepositoryRequest source(String repositoryDefinition) { - try (XContentParser parser = XContentFactory.xContent(repositoryDefinition).createParser(repositoryDefinition)) { - return source(parser.mapOrdered()); - } catch (IOException e) { - throw new IllegalArgumentException("failed to parse repository source [" + repositoryDefinition + "]", e); - } - } - - /** - * Parses repository definition. - * JSON, Smile and YAML formats are supported - * - * @param repositoryDefinition repository definition - */ - public PutRepositoryRequest source(byte[] repositoryDefinition) { - return source(repositoryDefinition, 0, repositoryDefinition.length); - } - - /** - * Parses repository definition. - * JSON, Smile and YAML formats are supported - * - * @param repositoryDefinition repository definition - */ - public PutRepositoryRequest source(byte[] repositoryDefinition, int offset, int length) { - try (XContentParser parser = XContentFactory.xContent(repositoryDefinition, offset, length).createParser(repositoryDefinition, offset, length)) { - return source(parser.mapOrdered()); - } catch (IOException e) { - throw new IllegalArgumentException("failed to parse repository source", e); - } - } - - /** - * Parses repository definition. - * JSON, Smile and YAML formats are supported - * - * @param repositoryDefinition repository definition - */ - public PutRepositoryRequest source(BytesReference repositoryDefinition) { - try (XContentParser parser = XContentFactory.xContent(repositoryDefinition).createParser(repositoryDefinition)) { - return source(parser.mapOrdered()); - } catch (IOException e) { - throw new IllegalArgumentException("failed to parse template source", e); - } - } - @Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/CreateSnapshotRequest.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/CreateSnapshotRequest.java index 922d52bc7551a..9cbc1b6563242 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/CreateSnapshotRequest.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/create/CreateSnapshotRequest.java @@ -25,13 +25,11 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.master.MasterNodeRequest; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.settings.Settings; 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 java.io.IOException; @@ -41,10 +39,9 @@ import static org.elasticsearch.action.ValidateActions.addValidationError; import static org.elasticsearch.common.Strings.EMPTY_ARRAY; -import static org.elasticsearch.common.Strings.hasLength; -import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS; import static org.elasticsearch.common.settings.Settings.readSettingsFromStream; import static org.elasticsearch.common.settings.Settings.writeSettingsToStream; +import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS; import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue; /** @@ -357,17 +354,7 @@ public boolean includeGlobalState() { * @param source snapshot definition * @return this request */ - public CreateSnapshotRequest source(XContentBuilder source) { - return source(source.bytes()); - } - - /** - * Parses snapshot definition. - * - * @param source snapshot definition - * @return this request - */ - public CreateSnapshotRequest source(Map source) { + public CreateSnapshotRequest source(Map source) { for (Map.Entry entry : ((Map) source).entrySet()) { String name = entry.getKey(); if (name.equals("indices")) { @@ -393,66 +380,6 @@ public CreateSnapshotRequest source(Map source) { return this; } - /** - * Parses snapshot definition. JSON, YAML and properties formats are supported - * - * @param source snapshot definition - * @return this request - */ - public CreateSnapshotRequest source(String source) { - if (hasLength(source)) { - try (XContentParser parser = XContentFactory.xContent(source).createParser(source)) { - return source(parser.mapOrdered()); - } catch (Exception e) { - throw new IllegalArgumentException("failed to parse repository source [" + source + "]", e); - } - } - return this; - } - - /** - * Parses snapshot definition. JSON, YAML and properties formats are supported - * - * @param source snapshot definition - * @return this request - */ - public CreateSnapshotRequest source(byte[] source) { - return source(source, 0, source.length); - } - - /** - * Parses snapshot definition. JSON, YAML and properties formats are supported - * - * @param source snapshot definition - * @param offset offset - * @param length length - * @return this request - */ - public CreateSnapshotRequest source(byte[] source, int offset, int length) { - if (length > 0) { - try (XContentParser parser = XContentFactory.xContent(source, offset, length).createParser(source, offset, length)) { - return source(parser.mapOrdered()); - } catch (IOException e) { - throw new IllegalArgumentException("failed to parse repository source", e); - } - } - return this; - } - - /** - * Parses snapshot definition. JSON, YAML and properties formats are supported - * - * @param source snapshot definition - * @return this request - */ - public CreateSnapshotRequest source(BytesReference source) { - try (XContentParser parser = XContentFactory.xContent(source).createParser(source)) { - return source(parser.mapOrdered()); - } catch (IOException e) { - throw new IllegalArgumentException("failed to parse snapshot source", e); - } - } - @Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); diff --git a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/restore/RestoreSnapshotRequest.java b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/restore/RestoreSnapshotRequest.java index 83b394467c473..641525f00e8bd 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/restore/RestoreSnapshotRequest.java +++ b/core/src/main/java/org/elasticsearch/action/admin/cluster/snapshots/restore/RestoreSnapshotRequest.java @@ -24,13 +24,11 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.master.MasterNodeRequest; import org.elasticsearch.common.Strings; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.settings.Settings; 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 java.io.IOException; @@ -39,10 +37,9 @@ import java.util.Map; import static org.elasticsearch.action.ValidateActions.addValidationError; -import static org.elasticsearch.common.Strings.hasLength; -import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS; import static org.elasticsearch.common.settings.Settings.readSettingsFromStream; import static org.elasticsearch.common.settings.Settings.writeSettingsToStream; +import static org.elasticsearch.common.settings.Settings.Builder.EMPTY_SETTINGS; import static org.elasticsearch.common.xcontent.support.XContentMapValues.lenientNodeBooleanValue; /** @@ -472,22 +469,8 @@ public Settings indexSettings() { * @param source restore definition * @return this request */ - public RestoreSnapshotRequest source(XContentBuilder source) { - try { - return source(source.bytes()); - } catch (Exception e) { - throw new IllegalArgumentException("Failed to build json for repository request", e); - } - } - - /** - * Parses restore definition - * - * @param source restore definition - * @return this request - */ - public RestoreSnapshotRequest source(Map source) { - for (Map.Entry entry : ((Map) source).entrySet()) { + public RestoreSnapshotRequest source(Map source) { + for (Map.Entry entry : source.entrySet()) { String name = entry.getKey(); if (name.equals("indices")) { if (entry.getValue() instanceof String) { @@ -543,74 +526,6 @@ public RestoreSnapshotRequest source(Map source) { return this; } - /** - * Parses restore definition - *

- * JSON, YAML and properties formats are supported - * - * @param source restore definition - * @return this request - */ - public RestoreSnapshotRequest source(String source) { - if (hasLength(source)) { - try (XContentParser parser = XContentFactory.xContent(source).createParser(source)) { - return source(parser.mapOrdered()); - } catch (Exception e) { - throw new IllegalArgumentException("failed to parse repository source [" + source + "]", e); - } - } - return this; - } - - /** - * Parses restore definition - *

- * JSON, YAML and properties formats are supported - * - * @param source restore definition - * @return this request - */ - public RestoreSnapshotRequest source(byte[] source) { - return source(source, 0, source.length); - } - - /** - * Parses restore definition - *

- * JSON, YAML and properties formats are supported - * - * @param source restore definition - * @param offset offset - * @param length length - * @return this request - */ - public RestoreSnapshotRequest source(byte[] source, int offset, int length) { - if (length > 0) { - try (XContentParser parser = XContentFactory.xContent(source, offset, length).createParser(source, offset, length)) { - return source(parser.mapOrdered()); - } catch (IOException e) { - throw new IllegalArgumentException("failed to parse repository source", e); - } - } - return this; - } - - /** - * Parses restore definition - *

- * JSON, YAML and properties formats are supported - * - * @param source restore definition - * @return this request - */ - public RestoreSnapshotRequest source(BytesReference source) { - try (XContentParser parser = XContentFactory.xContent(source).createParser(source)) { - return source(parser.mapOrdered()); - } catch (IOException e) { - throw new IllegalArgumentException("failed to parse template source", e); - } - } - @Override public void readFrom(StreamInput in) throws IOException { super.readFrom(in); diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/rollover/RolloverRequest.java b/core/src/main/java/org/elasticsearch/action/admin/indices/rollover/RolloverRequest.java index 854611658dfe5..ddd58705bea1f 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/rollover/RolloverRequest.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/rollover/RolloverRequest.java @@ -18,7 +18,6 @@ */ package org.elasticsearch.action.admin.indices.rollover; -import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.IndicesRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; @@ -26,16 +25,11 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.master.AcknowledgedRequest; import org.elasticsearch.common.ParseField; -import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.ParseFieldMatcherSupplier; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.ObjectParser; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.common.xcontent.XContentType; import java.io.IOException; import java.util.HashSet; @@ -50,7 +44,7 @@ */ public class RolloverRequest extends AcknowledgedRequest implements IndicesRequest { - public static ObjectParser PARSER = + public static final ObjectParser PARSER = new ObjectParser<>("conditions", null); static { PARSER.declareField((parser, request, parseFieldMatcherSupplier) -> @@ -194,19 +188,6 @@ CreateIndexRequest getCreateIndexRequest() { return createIndexRequest; } - public void source(BytesReference source) { - XContentType xContentType = XContentFactory.xContentType(source); - if (xContentType != null) { - try (XContentParser parser = XContentFactory.xContent(xContentType).createParser(source)) { - PARSER.parse(parser, this, () -> ParseFieldMatcher.EMPTY); - } catch (IOException e) { - throw new ElasticsearchParseException("failed to parse source for rollover index", e); - } - } else { - throw new ElasticsearchParseException("failed to parse content type for rollover index source"); - } - } - /** * Sets the number of shard copies that should be active for creation of the * new rollover index to return. Defaults to {@link ActiveShardCount#DEFAULT}, which will diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/shrink/ShrinkRequest.java b/core/src/main/java/org/elasticsearch/action/admin/indices/shrink/ShrinkRequest.java index 9cb60415a12cc..40a11402501ca 100644 --- a/core/src/main/java/org/elasticsearch/action/admin/indices/shrink/ShrinkRequest.java +++ b/core/src/main/java/org/elasticsearch/action/admin/indices/shrink/ShrinkRequest.java @@ -18,7 +18,6 @@ */ package org.elasticsearch.action.admin.indices.shrink; -import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.IndicesRequest; import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; @@ -26,15 +25,10 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.action.support.master.AcknowledgedRequest; import org.elasticsearch.common.ParseField; -import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.ParseFieldMatcherSupplier; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.ObjectParser; -import org.elasticsearch.common.xcontent.XContentFactory; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.common.xcontent.XContentType; import java.io.IOException; import java.util.Objects; @@ -46,7 +40,7 @@ */ public class ShrinkRequest extends AcknowledgedRequest implements IndicesRequest { - public static ObjectParser PARSER = + public static final ObjectParser PARSER = new ObjectParser<>("shrink_request", null); static { PARSER.declareField((parser, request, parseFieldMatcherSupplier) -> @@ -152,17 +146,4 @@ public void setWaitForActiveShards(ActiveShardCount waitForActiveShards) { public void setWaitForActiveShards(final int waitForActiveShards) { setWaitForActiveShards(ActiveShardCount.from(waitForActiveShards)); } - - public void source(BytesReference source) { - XContentType xContentType = XContentFactory.xContentType(source); - if (xContentType != null) { - try (XContentParser parser = XContentFactory.xContent(xContentType).createParser(source)) { - PARSER.parse(parser, this, () -> ParseFieldMatcher.EMPTY); - } catch (IOException e) { - throw new ElasticsearchParseException("failed to parse source for shrink index", e); - } - } else { - throw new ElasticsearchParseException("failed to parse content type for shrink index source"); - } - } } diff --git a/core/src/main/java/org/elasticsearch/action/bulk/BulkRequest.java b/core/src/main/java/org/elasticsearch/action/bulk/BulkRequest.java index 843e718a94e2c..5c3e8d9295e81 100644 --- a/core/src/main/java/org/elasticsearch/action/bulk/BulkRequest.java +++ b/core/src/main/java/org/elasticsearch/action/bulk/BulkRequest.java @@ -23,7 +23,6 @@ import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.CompositeIndicesRequest; import org.elasticsearch.action.DocWriteRequest; -import org.elasticsearch.action.IndicesRequest; import org.elasticsearch.action.delete.DeleteRequest; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.support.ActiveShardCount; @@ -400,8 +399,10 @@ public BulkRequest add(BytesReference data, @Nullable String defaultIndex, @Null UpdateRequest updateRequest = new UpdateRequest(index, type, id).routing(routing).parent(parent).retryOnConflict(retryOnConflict) .version(version).versionType(versionType) .routing(routing) - .parent(parent) - .fromXContent(data.slice(from, nextMarker - from)); + .parent(parent); + try (XContentParser sliceParser = xContent.createParser(data.slice(from, nextMarker - from))) { + updateRequest.fromXContent(sliceParser); + } if (fetchSourceContext != null) { updateRequest.fetchSource(fetchSourceContext); } diff --git a/core/src/main/java/org/elasticsearch/action/update/UpdateRequest.java b/core/src/main/java/org/elasticsearch/action/update/UpdateRequest.java index f59fd142e71e3..a812cb22eb6a0 100644 --- a/core/src/main/java/org/elasticsearch/action/update/UpdateRequest.java +++ b/core/src/main/java/org/elasticsearch/action/update/UpdateRequest.java @@ -28,8 +28,6 @@ import org.elasticsearch.action.support.single.instance.InstanceShardOperationRequest; import org.elasticsearch.common.Nullable; import org.elasticsearch.common.ParseFieldMatcher; -import org.elasticsearch.common.bytes.BytesArray; -import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.logging.DeprecationLogger; @@ -689,18 +687,6 @@ private IndexRequest safeUpsertRequest() { return upsertRequest; } - public UpdateRequest fromXContent(XContentBuilder source) throws Exception { - return fromXContent(source.bytes()); - } - - public UpdateRequest fromXContent(byte[] source) throws Exception { - return fromXContent(source, 0, source.length); - } - - public UpdateRequest fromXContent(byte[] source, int offset, int length) throws Exception { - return fromXContent(new BytesArray(source, offset, length)); - } - /** * Should this update attempt to detect if it is a noop? Defaults to true. * @return this for chaining @@ -717,52 +703,48 @@ public boolean detectNoop() { return detectNoop; } - public UpdateRequest fromXContent(BytesReference source) throws IOException { + public UpdateRequest fromXContent(XContentParser parser) throws IOException { Script script = null; - try (XContentParser parser = XContentFactory.xContent(source).createParser(source)) { - XContentParser.Token token = parser.nextToken(); - if (token == null) { - return this; - } - String currentFieldName = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if ("script".equals(currentFieldName)) { - script = Script.parse(parser, ParseFieldMatcher.EMPTY); - } else if ("scripted_upsert".equals(currentFieldName)) { - scriptedUpsert = parser.booleanValue(); - } else if ("upsert".equals(currentFieldName)) { - XContentType xContentType = XContentFactory.xContentType(source); - XContentBuilder builder = XContentFactory.contentBuilder(xContentType); - builder.copyCurrentStructure(parser); - safeUpsertRequest().source(builder); - } else if ("doc".equals(currentFieldName)) { - XContentType xContentType = XContentFactory.xContentType(source); - XContentBuilder docBuilder = XContentFactory.contentBuilder(xContentType); - docBuilder.copyCurrentStructure(parser); - safeDoc().source(docBuilder); - } else if ("doc_as_upsert".equals(currentFieldName)) { - docAsUpsert(parser.booleanValue()); - } else if ("detect_noop".equals(currentFieldName)) { - detectNoop(parser.booleanValue()); - } else if ("fields".equals(currentFieldName)) { - List fields = null; - if (token == XContentParser.Token.START_ARRAY) { - fields = (List) parser.list(); - } else if (token.isValue()) { - fields = Collections.singletonList(parser.text()); - } - if (fields != null) { - fields(fields.toArray(new String[fields.size()])); - } - } else if ("_source".equals(currentFieldName)) { - fetchSourceContext = FetchSourceContext.parse(parser); + XContentParser.Token token = parser.nextToken(); + if (token == null) { + return this; + } + String currentFieldName = null; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if ("script".equals(currentFieldName)) { + script = Script.parse(parser, ParseFieldMatcher.EMPTY); + } else if ("scripted_upsert".equals(currentFieldName)) { + scriptedUpsert = parser.booleanValue(); + } else if ("upsert".equals(currentFieldName)) { + XContentBuilder builder = XContentFactory.contentBuilder(parser.contentType()); + builder.copyCurrentStructure(parser); + safeUpsertRequest().source(builder); + } else if ("doc".equals(currentFieldName)) { + XContentBuilder docBuilder = XContentFactory.contentBuilder(parser.contentType()); + docBuilder.copyCurrentStructure(parser); + safeDoc().source(docBuilder); + } else if ("doc_as_upsert".equals(currentFieldName)) { + docAsUpsert(parser.booleanValue()); + } else if ("detect_noop".equals(currentFieldName)) { + detectNoop(parser.booleanValue()); + } else if ("fields".equals(currentFieldName)) { + List fields = null; + if (token == XContentParser.Token.START_ARRAY) { + fields = (List) parser.list(); + } else if (token.isValue()) { + fields = Collections.singletonList(parser.text()); } + if (fields != null) { + fields(fields.toArray(new String[fields.size()])); + } + } else if ("_source".equals(currentFieldName)) { + fetchSourceContext = FetchSourceContext.parse(parser); } - if (script != null) { - this.script = script; - } + } + if (script != null) { + this.script = script; } return this; } diff --git a/core/src/main/java/org/elasticsearch/rest/RestRequest.java b/core/src/main/java/org/elasticsearch/rest/RestRequest.java index e6f1c2816b217..ad6a367a7b7a0 100644 --- a/core/src/main/java/org/elasticsearch/rest/RestRequest.java +++ b/core/src/main/java/org/elasticsearch/rest/RestRequest.java @@ -19,7 +19,6 @@ package org.elasticsearch.rest; -import org.apache.lucene.util.IOUtils; import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.common.Booleans; import org.elasticsearch.common.CheckedConsumer; @@ -229,6 +228,30 @@ public String[] paramAsStringArrayOrEmptyIfAll(String key) { return params; } + /** + * A parser for the contents of this request if there is a body, otherwise throws an {@link ElasticsearchParseException}. Use + * {@link #applyContentParser(CheckedConsumer)} if you want to gracefully handle when the request doesn't have any contents. Use + * {@link #contentOrSourceParamParser()} for requests that support specifying the request body in the {@code source} param. + */ + public final XContentParser contentParser() throws IOException { + BytesReference content = content(); + if (content.length() == 0) { + throw new ElasticsearchParseException("Body required"); + } + return XContentFactory.xContent(content).createParser(content); + } + + /** + * If there is any content then call {@code applyParser} with the parser, otherwise do nothing. + */ + public final void applyContentParser(CheckedConsumer applyParser) throws IOException { + if (hasContent()) { + try (XContentParser parser = contentParser()) { + applyParser.accept(parser); + } + } + } + /** * Does this request have content or a {@code source} parameter? Use this instead of {@link #hasContent()} if this * {@linkplain RestHandler} treats the {@code source} parameter like the body content. @@ -256,16 +279,13 @@ public final XContentParser contentOrSourceParamParser() throws IOException { * back to the user when there isn't request content. */ public final void withContentOrSourceParamParserOrNull(CheckedConsumer withParser) throws IOException { - XContentParser parser = null; BytesReference content = contentOrSourceParam(); if (content.length() > 0) { - parser = XContentFactory.xContent(content).createParser(content); - } - - try { - withParser.accept(parser); - } finally { - IOUtils.close(parser); + try (XContentParser parser = XContentFactory.xContent(content).createParser(content)) { + withParser.accept(parser); + } + } else { + withParser.accept(null); } } diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterRerouteAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterRerouteAction.java index d5815b3b31ca4..31eef941a8b99 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterRerouteAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterRerouteAction.java @@ -121,11 +121,7 @@ public static ClusterRerouteRequest createRequest(RestRequest request, Allocatio clusterRerouteRequest.timeout(request.paramAsTime("timeout", clusterRerouteRequest.timeout())); clusterRerouteRequest.setRetryFailed(request.paramAsBoolean("retry_failed", clusterRerouteRequest.isRetryFailed())); clusterRerouteRequest.masterNodeTimeout(request.paramAsTime("master_timeout", clusterRerouteRequest.masterNodeTimeout())); - if (request.hasContent()) { - try (XContentParser parser = XContentHelper.createParser(request.content())) { - PARSER.parse(parser, clusterRerouteRequest, new ParseContext(registry, parseFieldMatcher)); - } - } + request.applyContentParser(parser -> PARSER.parse(parser, clusterRerouteRequest, new ParseContext(registry, parseFieldMatcher))); return clusterRerouteRequest; } diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java index b041ae4c3abb7..1213b03c4670d 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestClusterUpdateSettingsAction.java @@ -26,7 +26,6 @@ import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestController; @@ -52,7 +51,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC clusterUpdateSettingsRequest.masterNodeTimeout( request.paramAsTime("master_timeout", clusterUpdateSettingsRequest.masterNodeTimeout())); Map source; - try (XContentParser parser = XContentFactory.xContent(request.content()).createParser(request.content())) { + try (XContentParser parser = request.contentParser()) { source = parser.map(); } if (source.containsKey("transient")) { diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestCreateSnapshotAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestCreateSnapshotAction.java index 84ca88d292b02..6bd3223003f1d 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestCreateSnapshotAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestCreateSnapshotAction.java @@ -49,7 +49,7 @@ public RestCreateSnapshotAction(Settings settings, RestController controller) { @Override public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException { CreateSnapshotRequest createSnapshotRequest = createSnapshotRequest(request.param("repository"), request.param("snapshot")); - createSnapshotRequest.source(request.content().utf8ToString()); + request.applyContentParser(p -> createSnapshotRequest.source(p.mapOrdered())); createSnapshotRequest.masterNodeTimeout(request.paramAsTime("master_timeout", createSnapshotRequest.masterNodeTimeout())); createSnapshotRequest.waitForCompletion(request.paramAsBoolean("wait_for_completion", false)); return channel -> client.admin().cluster().createSnapshot(createSnapshotRequest, new RestToXContentListener<>(channel)); diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestPutRepositoryAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestPutRepositoryAction.java index c142230925d31..794ccf410b974 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestPutRepositoryAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestPutRepositoryAction.java @@ -23,6 +23,7 @@ import org.elasticsearch.client.node.NodeClient; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestController; import org.elasticsearch.rest.RestRequest; @@ -50,7 +51,9 @@ public RestPutRepositoryAction(Settings settings, RestController controller) { @Override public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException { PutRepositoryRequest putRepositoryRequest = putRepositoryRequest(request.param("repository")); - putRepositoryRequest.source(request.content().utf8ToString()); + try (XContentParser parser = request.contentParser()) { + putRepositoryRequest.source(parser.mapOrdered()); + } putRepositoryRequest.verify(request.paramAsBoolean("verify", true)); putRepositoryRequest.masterNodeTimeout(request.paramAsTime("master_timeout", putRepositoryRequest.masterNodeTimeout())); putRepositoryRequest.timeout(request.paramAsTime("timeout", putRepositoryRequest.timeout())); diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestRestoreSnapshotAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestRestoreSnapshotAction.java index f94990e1ae7bf..a6d0cad709173 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestRestoreSnapshotAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/cluster/RestRestoreSnapshotAction.java @@ -49,7 +49,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC RestoreSnapshotRequest restoreSnapshotRequest = restoreSnapshotRequest(request.param("repository"), request.param("snapshot")); restoreSnapshotRequest.masterNodeTimeout(request.paramAsTime("master_timeout", restoreSnapshotRequest.masterNodeTimeout())); restoreSnapshotRequest.waitForCompletion(request.paramAsBoolean("wait_for_completion", false)); - restoreSnapshotRequest.source(request.content().utf8ToString()); + request.applyContentParser(p -> restoreSnapshotRequest.source(p.mapOrdered())); return channel -> client.admin().cluster().restoreSnapshot(restoreSnapshotRequest, new RestToXContentListener<>(channel)); } } diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestCreateIndexAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestCreateIndexAction.java index 7aabdfd576277..d1e6919f4c06a 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestCreateIndexAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestCreateIndexAction.java @@ -41,7 +41,6 @@ public RestCreateIndexAction(Settings settings, RestController controller) { controller.registerHandler(RestRequest.Method.PUT, "/{index}", this); } - @SuppressWarnings({"unchecked"}) @Override public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException { CreateIndexRequest createIndexRequest = new CreateIndexRequest(request.param("index")); diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestIndexPutAliasAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestIndexPutAliasAction.java index da8ab809c10f0..9b6e80df98a01 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestIndexPutAliasAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestIndexPutAliasAction.java @@ -67,7 +67,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC String searchRouting = null; if (request.hasContent()) { - try (XContentParser parser = XContentFactory.xContent(request.content()).createParser(request.content())) { + try (XContentParser parser = request.contentParser()) { XContentParser.Token token = parser.nextToken(); if (token == null) { throw new IllegalArgumentException("No index alias is specified"); diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestIndicesAliasesAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestIndicesAliasesAction.java index d02e2caf5a381..84eeda9e1e764 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestIndicesAliasesAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestIndicesAliasesAction.java @@ -21,7 +21,6 @@ import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest; import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest.AliasActions; -import org.elasticsearch.action.admin.indices.alias.IndicesAliasesResponse; import org.elasticsearch.client.node.NodeClient; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.ParseFieldMatcher; @@ -29,7 +28,6 @@ import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ObjectParser; -import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.RestController; @@ -61,7 +59,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC IndicesAliasesRequest indicesAliasesRequest = new IndicesAliasesRequest(); indicesAliasesRequest.masterNodeTimeout(request.paramAsTime("master_timeout", indicesAliasesRequest.masterNodeTimeout())); indicesAliasesRequest.timeout(request.paramAsTime("timeout", indicesAliasesRequest.timeout())); - try (XContentParser parser = XContentFactory.xContent(request.content()).createParser(request.content())) { + try (XContentParser parser = request.contentParser()) { PARSER.parse(parser, indicesAliasesRequest, () -> ParseFieldMatcher.STRICT); } if (indicesAliasesRequest.getAliasActions().isEmpty()) { diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestRolloverIndexAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestRolloverIndexAction.java index 7c68fea435799..ec42b426401ae 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestRolloverIndexAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestRolloverIndexAction.java @@ -22,6 +22,7 @@ import org.elasticsearch.action.admin.indices.rollover.RolloverRequest; import org.elasticsearch.action.support.ActiveShardCount; import org.elasticsearch.client.node.NodeClient; +import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.rest.BaseRestHandler; @@ -40,13 +41,10 @@ public RestRolloverIndexAction(Settings settings, RestController controller) { controller.registerHandler(RestRequest.Method.POST, "/{index}/_rollover/{new_index}", this); } - @SuppressWarnings({"unchecked"}) @Override public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException { RolloverRequest rolloverIndexRequest = new RolloverRequest(request.param("index"), request.param("new_index")); - if (request.hasContent()) { - rolloverIndexRequest.source(request.content()); - } + request.applyContentParser(parser -> RolloverRequest.PARSER.parse(parser, rolloverIndexRequest, () -> ParseFieldMatcher.EMPTY)); rolloverIndexRequest.dryRun(request.paramAsBoolean("dry_run", false)); rolloverIndexRequest.timeout(request.paramAsTime("timeout", rolloverIndexRequest.timeout())); rolloverIndexRequest.masterNodeTimeout(request.paramAsTime("master_timeout", rolloverIndexRequest.masterNodeTimeout())); diff --git a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestShrinkIndexAction.java b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestShrinkIndexAction.java index fb65825ac6ef7..b533c8e5e7a9b 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestShrinkIndexAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/admin/indices/RestShrinkIndexAction.java @@ -23,6 +23,7 @@ import org.elasticsearch.action.admin.indices.shrink.ShrinkResponse; import org.elasticsearch.action.support.ActiveShardCount; import org.elasticsearch.client.node.NodeClient; +import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -42,7 +43,6 @@ public RestShrinkIndexAction(Settings settings, RestController controller) { controller.registerHandler(RestRequest.Method.POST, "/{index}/_shrink/{target}", this); } - @SuppressWarnings({"unchecked"}) @Override public RestChannelConsumer prepareRequest(final RestRequest request, final NodeClient client) throws IOException { if (request.param("target") == null) { @@ -52,9 +52,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC throw new IllegalArgumentException("no source index"); } ShrinkRequest shrinkIndexRequest = new ShrinkRequest(request.param("target"), request.param("index")); - if (request.hasContent()) { - shrinkIndexRequest.source(request.content()); - } + request.applyContentParser(parser -> ShrinkRequest.PARSER.parse(parser, shrinkIndexRequest, () -> ParseFieldMatcher.EMPTY)); shrinkIndexRequest.timeout(request.paramAsTime("timeout", shrinkIndexRequest.timeout())); shrinkIndexRequest.masterNodeTimeout(request.paramAsTime("master_timeout", shrinkIndexRequest.masterNodeTimeout())); shrinkIndexRequest.setWaitForActiveShards(ActiveShardCount.parseString(request.param("wait_for_active_shards"))); diff --git a/core/src/main/java/org/elasticsearch/rest/action/document/RestUpdateAction.java b/core/src/main/java/org/elasticsearch/rest/action/document/RestUpdateAction.java index feb2d39b8f6b1..ade0200215acf 100644 --- a/core/src/main/java/org/elasticsearch/rest/action/document/RestUpdateAction.java +++ b/core/src/main/java/org/elasticsearch/rest/action/document/RestUpdateAction.java @@ -80,9 +80,8 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC updateRequest.versionType(VersionType.fromString(request.param("version_type"), updateRequest.versionType())); - // see if we have it in the body - if (request.hasContent()) { - updateRequest.fromXContent(request.content()); + request.applyContentParser(parser -> { + updateRequest.fromXContent(parser); IndexRequest upsertRequest = updateRequest.upsertRequest(); if (upsertRequest != null) { upsertRequest.routing(request.param("routing")); @@ -97,7 +96,7 @@ public RestChannelConsumer prepareRequest(final RestRequest request, final NodeC doc.version(RestActions.parseVersion(request)); doc.versionType(VersionType.fromString(request.param("version_type"), doc.versionType())); } - } + }); return channel -> client.update(updateRequest, new RestStatusToXContentListener<>(channel, r -> r.getLocation(updateRequest.routing()))); diff --git a/core/src/test/java/org/elasticsearch/action/admin/indices/rollover/RolloverRequestTests.java b/core/src/test/java/org/elasticsearch/action/admin/indices/rollover/RolloverRequestTests.java index 7f4db3b840900..999d16fdcb52f 100644 --- a/core/src/test/java/org/elasticsearch/action/admin/indices/rollover/RolloverRequestTests.java +++ b/core/src/test/java/org/elasticsearch/action/admin/indices/rollover/RolloverRequestTests.java @@ -19,9 +19,11 @@ package org.elasticsearch.action.admin.indices.rollover; +import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; +import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.test.ESTestCase; import java.util.Set; @@ -39,7 +41,7 @@ public void testConditionsParsing() throws Exception { .field("max_docs", 100) .endObject() .endObject(); - request.source(builder.bytes()); + RolloverRequest.PARSER.parse(XContentHelper.createParser(builder.bytes()), request, () -> ParseFieldMatcher.EMPTY); Set conditions = request.getConditions(); assertThat(conditions.size(), equalTo(2)); for (Condition condition : conditions) { @@ -80,7 +82,7 @@ public void testParsingWithIndexSettings() throws Exception { .startObject("alias1").endObject() .endObject() .endObject(); - request.source(builder.bytes()); + RolloverRequest.PARSER.parse(XContentHelper.createParser(builder.bytes()), request, () -> ParseFieldMatcher.EMPTY); Set conditions = request.getConditions(); assertThat(conditions.size(), equalTo(2)); assertThat(request.getCreateIndexRequest().mappings().size(), equalTo(1)); diff --git a/core/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java b/core/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java index cdf6a225620c6..8c342265a288b 100644 --- a/core/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java +++ b/core/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java @@ -19,13 +19,11 @@ package org.elasticsearch.action.update; -import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.Version; import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.io.stream.Streamable; import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.env.Environment; @@ -36,8 +34,8 @@ import org.elasticsearch.script.ScriptContextRegistry; import org.elasticsearch.script.ScriptEngineRegistry; import org.elasticsearch.script.ScriptService; -import org.elasticsearch.script.ScriptType; import org.elasticsearch.script.ScriptSettings; +import org.elasticsearch.script.ScriptType; import org.elasticsearch.test.ESTestCase; import org.elasticsearch.watcher.ResourceWatcherService; @@ -52,17 +50,16 @@ import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.nullValue; public class UpdateRequestTests extends ESTestCase { public void testUpdateRequest() throws Exception { UpdateRequest request = new UpdateRequest("test", "type", "1"); // simple script - request.fromXContent(XContentFactory.jsonBuilder().startObject() - .field("script", "script1") - .endObject()); + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder() + .startObject() + .field("script", "script1") + .endObject().bytes())); Script script = request.script(); assertThat(script, notNullValue()); assertThat(script.getIdOrCode(), equalTo("script1")); @@ -72,9 +69,9 @@ public void testUpdateRequest() throws Exception { assertThat(params, equalTo(Collections.emptyMap())); // simple verbose script - request.fromXContent(XContentFactory.jsonBuilder().startObject() - .startObject("script").field("inline", "script1").endObject() - .endObject()); + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder().startObject() + .startObject("script").field("inline", "script1").endObject() + .endObject().bytes())); script = request.script(); assertThat(script, notNullValue()); assertThat(script.getIdOrCode(), equalTo("script1")); @@ -85,13 +82,13 @@ public void testUpdateRequest() throws Exception { // script with params request = new UpdateRequest("test", "type", "1"); - request.fromXContent(XContentFactory.jsonBuilder().startObject() + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder().startObject() .startObject("script") .field("inline", "script1") .startObject("params") .field("param1", "value1") .endObject() - .endObject().endObject()); + .endObject().endObject().bytes())); script = request.script(); assertThat(script, notNullValue()); assertThat(script.getIdOrCode(), equalTo("script1")); @@ -103,9 +100,15 @@ public void testUpdateRequest() throws Exception { assertThat(params.get("param1").toString(), equalTo("value1")); request = new UpdateRequest("test", "type", "1"); - request.fromXContent(XContentFactory.jsonBuilder().startObject().startObject("script") - .startObject("params").field("param1", "value1").endObject() - .field("inline", "script1").endObject().endObject()); + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder() + .startObject() + .startObject("script") + .startObject("params") + .field("param1", "value1") + .endObject() + .field("inline", "script1") + .endObject() + .endObject().bytes())); script = request.script(); assertThat(script, notNullValue()); assertThat(script.getIdOrCode(), equalTo("script1")); @@ -118,7 +121,7 @@ public void testUpdateRequest() throws Exception { // script with params and upsert request = new UpdateRequest("test", "type", "1"); - request.fromXContent(XContentFactory.jsonBuilder().startObject() + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder().startObject() .startObject("script") .startObject("params") .field("param1", "value1") @@ -130,7 +133,7 @@ public void testUpdateRequest() throws Exception { .startObject("compound") .field("field2", "value2") .endObject() - .endObject().endObject()); + .endObject().endObject().bytes())); script = request.script(); assertThat(script, notNullValue()); assertThat(script.getIdOrCode(), equalTo("script1")); @@ -145,7 +148,7 @@ public void testUpdateRequest() throws Exception { assertThat(((Map) upsertDoc.get("compound")).get("field2").toString(), equalTo("value2")); request = new UpdateRequest("test", "type", "1"); - request.fromXContent(XContentFactory.jsonBuilder().startObject() + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder().startObject() .startObject("upsert") .field("field1", "value1") .startObject("compound") @@ -157,7 +160,7 @@ public void testUpdateRequest() throws Exception { .field("param1", "value1") .endObject() .field("inline", "script1") - .endObject().endObject()); + .endObject().endObject().bytes())); script = request.script(); assertThat(script, notNullValue()); assertThat(script.getIdOrCode(), equalTo("script1")); @@ -173,69 +176,70 @@ public void testUpdateRequest() throws Exception { // script with doc request = new UpdateRequest("test", "type", "1"); - request.fromXContent(XContentFactory.jsonBuilder().startObject() - .startObject("doc").field("field1", "value1").startObject("compound") - .field("field2", "value2").endObject().endObject().endObject()); + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder() + .startObject() + .startObject("doc") + .field("field1", "value1") + .startObject("compound") + .field("field2", "value2") + .endObject() + .endObject() + .endObject().bytes())); Map doc = request.doc().sourceAsMap(); assertThat(doc.get("field1").toString(), equalTo("value1")); assertThat(((Map) doc.get("compound")).get("field2").toString(), equalTo("value2")); } - // Related to issue #15822 - public void testInvalidBodyThrowsParseException() throws Exception { - UpdateRequest request = new UpdateRequest("test", "type", "1"); - Exception e = expectThrows(ElasticsearchParseException.class, () -> request.fromXContent(new byte[] { (byte) '"' })); - assertThat(e.getMessage(), equalTo("Failed to derive xcontent")); - } - // Related to issue 15338 public void testFieldsParsing() throws Exception { UpdateRequest request = new UpdateRequest("test", "type1", "1") - .fromXContent(new BytesArray("{\"doc\": {\"field1\": \"value1\"}, \"fields\": \"_source\"}")); + .fromXContent(XContentHelper.createParser(new BytesArray("{\"doc\": {\"field1\": \"value1\"}, \"fields\": \"_source\"}"))); assertThat(request.doc().sourceAsMap().get("field1").toString(), equalTo("value1")); assertThat(request.fields(), arrayContaining("_source")); - request = new UpdateRequest("test", "type2", "2") - .fromXContent(new BytesArray("{\"doc\": {\"field2\": \"value2\"}, \"fields\": [\"field1\", \"field2\"]}")); + request = new UpdateRequest("test", "type2", "2").fromXContent( + XContentHelper.createParser(new BytesArray("{\"doc\": {\"field2\": \"value2\"}, \"fields\": [\"field1\", \"field2\"]}"))); assertThat(request.doc().sourceAsMap().get("field2").toString(), equalTo("value2")); assertThat(request.fields(), arrayContaining("field1", "field2")); } public void testFetchSourceParsing() throws Exception { UpdateRequest request = new UpdateRequest("test", "type1", "1"); - request.fromXContent( - XContentFactory.jsonBuilder().startObject().field("_source", true).endObject() - ); + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder() + .startObject() + .field("_source", true) + .endObject().bytes())); assertThat(request.fetchSource(), notNullValue()); assertThat(request.fetchSource().includes().length, equalTo(0)); assertThat(request.fetchSource().excludes().length, equalTo(0)); assertThat(request.fetchSource().fetchSource(), equalTo(true)); - request.fromXContent( - XContentFactory.jsonBuilder().startObject().field("_source", false).endObject() - ); + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder() + .startObject() + .field("_source", false) + .endObject().bytes())); assertThat(request.fetchSource(), notNullValue()); assertThat(request.fetchSource().includes().length, equalTo(0)); assertThat(request.fetchSource().excludes().length, equalTo(0)); assertThat(request.fetchSource().fetchSource(), equalTo(false)); - request.fromXContent( - XContentFactory.jsonBuilder().startObject().field("_source", "path.inner.*").endObject() - ); + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder() + .startObject() + .field("_source", "path.inner.*") + .endObject().bytes())); assertThat(request.fetchSource(), notNullValue()); assertThat(request.fetchSource().fetchSource(), equalTo(true)); assertThat(request.fetchSource().includes().length, equalTo(1)); assertThat(request.fetchSource().excludes().length, equalTo(0)); assertThat(request.fetchSource().includes()[0], equalTo("path.inner.*")); - request.fromXContent( - XContentFactory.jsonBuilder().startObject() - .startObject("_source") - .field("includes", "path.inner.*") - .field("excludes", "another.inner.*") - .endObject() - .endObject() - ); + request.fromXContent(XContentHelper.createParser(XContentFactory.jsonBuilder() + .startObject() + .startObject("_source") + .field("includes", "path.inner.*") + .field("excludes", "another.inner.*") + .endObject() + .endObject().bytes())); assertThat(request.fetchSource(), notNullValue()); assertThat(request.fetchSource().fetchSource(), equalTo(true)); assertThat(request.fetchSource().includes().length, equalTo(1)); @@ -254,13 +258,17 @@ public void testNowInScript() throws IOException { Map, Object>> scripts = new HashMap<>(); scripts.put("ctx._source.update_timestamp = ctx._now", (vars) -> { - Map ctx = (Map) vars.get("ctx"); - Map source = (Map) ctx.get("_source"); + Map vars2 = vars; + @SuppressWarnings("unchecked") + Map ctx = (Map) vars2.get("ctx"); + @SuppressWarnings("unchecked") + Map source = (Map) ctx.get("_source"); source.put("update_timestamp", ctx.get("_now")); return null;}); scripts.put("ctx._timestamp = ctx._now", (vars) -> { - Map ctx = (Map) vars.get("ctx"); + @SuppressWarnings("unchecked") + Map ctx = (Map) vars.get("ctx"); ctx.put("_timestamp", ctx.get("_now")); return null;}); ScriptContextRegistry scriptContextRegistry = new ScriptContextRegistry(Collections.emptyList()); diff --git a/core/src/test/java/org/elasticsearch/rest/RestRequestTests.java b/core/src/test/java/org/elasticsearch/rest/RestRequestTests.java index a75f891698c10..0511b3919b784 100644 --- a/core/src/test/java/org/elasticsearch/rest/RestRequestTests.java +++ b/core/src/test/java/org/elasticsearch/rest/RestRequestTests.java @@ -28,11 +28,30 @@ import java.io.IOException; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicReference; import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; public class RestRequestTests extends ESTestCase { + public void testContentParser() throws IOException { + Exception e = expectThrows(ElasticsearchParseException.class, () -> + new ContentRestRequest("", emptyMap()).contentParser()); + assertEquals("Body required", e.getMessage()); + e = expectThrows(ElasticsearchParseException.class, () -> + new ContentRestRequest("", singletonMap("source", "{}")).contentParser()); + assertEquals("Body required", e.getMessage()); + assertEquals(emptyMap(), new ContentRestRequest("{}", emptyMap()).contentParser().map()); + } + + public void testApplyContentParser() throws IOException { + new ContentRestRequest("", emptyMap()).applyContentParser(p -> fail("Shouldn't have been called")); + new ContentRestRequest("", singletonMap("source", "{}")).applyContentParser(p -> fail("Shouldn't have been called")); + AtomicReference source = new AtomicReference<>(); + new ContentRestRequest("{}", emptyMap()).applyContentParser(p -> source.set(p.map())); + assertEquals(emptyMap(), source.get()); + } + public void testContentOrSourceParam() throws IOException { assertEquals(BytesArray.EMPTY, new ContentRestRequest("", emptyMap()).contentOrSourceParam()); assertEquals(new BytesArray("stuff"), new ContentRestRequest("stuff", emptyMap()).contentOrSourceParam()); @@ -47,15 +66,6 @@ public void testHasContentOrSourceParam() throws IOException { assertEquals(true, new ContentRestRequest("", singletonMap("source", "stuff")).hasContentOrSourceParam()); } - public void testContentOrSourceParamParserOrNull() throws IOException { - new ContentRestRequest("", emptyMap()).withContentOrSourceParamParserOrNull(parser -> assertNull(parser)); - new ContentRestRequest("{}", emptyMap()).withContentOrSourceParamParserOrNull(parser -> assertEquals(emptyMap(), parser.map())); - new ContentRestRequest("{}", singletonMap("source", "stuff2")).withContentOrSourceParamParserOrNull(parser -> - assertEquals(emptyMap(), parser.map())); - new ContentRestRequest("", singletonMap("source", "{}")).withContentOrSourceParamParserOrNull(parser -> - assertEquals(emptyMap(), parser.map())); - } - public void testContentOrSourceParamParser() throws IOException { Exception e = expectThrows(ElasticsearchParseException.class, () -> new ContentRestRequest("", emptyMap()).contentOrSourceParamParser()); @@ -65,6 +75,15 @@ public void testContentOrSourceParamParser() throws IOException { assertEquals(emptyMap(), new ContentRestRequest("", singletonMap("source", "{}")).contentOrSourceParamParser().map()); } + public void testWithContentOrSourceParamParserOrNull() throws IOException { + new ContentRestRequest("", emptyMap()).withContentOrSourceParamParserOrNull(parser -> assertNull(parser)); + new ContentRestRequest("{}", emptyMap()).withContentOrSourceParamParserOrNull(parser -> assertEquals(emptyMap(), parser.map())); + new ContentRestRequest("{}", singletonMap("source", "stuff2")).withContentOrSourceParamParserOrNull(parser -> + assertEquals(emptyMap(), parser.map())); + new ContentRestRequest("", singletonMap("source", "{}")).withContentOrSourceParamParserOrNull(parser -> + assertEquals(emptyMap(), parser.map())); + } + private static final class ContentRestRequest extends RestRequest { private final BytesArray content; public ContentRestRequest(String content, Map params) { diff --git a/core/src/test/java/org/elasticsearch/snapshots/SnapshotRequestsTests.java b/core/src/test/java/org/elasticsearch/snapshots/SnapshotRequestsTests.java index c178b2a6f83bd..581280a5a9bed 100644 --- a/core/src/test/java/org/elasticsearch/snapshots/SnapshotRequestsTests.java +++ b/core/src/test/java/org/elasticsearch/snapshots/SnapshotRequestsTests.java @@ -24,6 +24,7 @@ import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.xcontent.XContentBuilder; +import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.test.ESTestCase; import java.io.IOException; @@ -76,10 +77,9 @@ public void testRestoreSnapshotRequestParsing() throws IOException { builder.endArray(); } - byte[] bytes = BytesReference.toBytes(builder.endObject().bytes()); + BytesReference bytes = builder.endObject().bytes(); - - request.source(bytes); + request.source(XContentHelper.createParser(bytes).mapOrdered()); assertEquals("test-repo", request.repository()); assertEquals("test-snap", request.snapshot()); @@ -135,10 +135,9 @@ public void testCreateSnapshotRequestParsing() throws IOException { builder.endArray(); } - byte[] bytes = BytesReference.toBytes(builder.endObject().bytes()); - + BytesReference bytes = builder.endObject().bytes(); - request.source(bytes); + request.source(XContentHelper.createParser(bytes).mapOrdered()); assertEquals("test-repo", request.repository()); assertEquals("test-snap", request.snapshot()); diff --git a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java index a129733640f4d..ad9cd334b88fd 100644 --- a/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java +++ b/modules/reindex/src/main/java/org/elasticsearch/index/reindex/RestReindexAction.java @@ -117,16 +117,13 @@ public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client @Override protected ReindexRequest buildRequest(RestRequest request) throws IOException { - if (false == request.hasContent()) { - throw new IllegalArgumentException("_reindex requires a request body"); - } if (request.hasParam("pipeline")) { throw new IllegalArgumentException("_reindex doesn't support [pipeline] as a query parmaeter. " + "Specify it in the [dest] object instead."); } ReindexRequest internal = new ReindexRequest(new SearchRequest(), new IndexRequest()); - try (XContentParser xcontent = XContentFactory.xContent(request.content()).createParser(request.content())) { - PARSER.parse(xcontent, internal, new ReindexParseContext(searchRequestParsers, parseFieldMatcher)); + try (XContentParser parser = request.contentParser()) { + PARSER.parse(parser, internal, new ReindexParseContext(searchRequestParsers, parseFieldMatcher)); } return internal; } diff --git a/qa/smoke-test-http/src/test/java/org/elasticsearch/http/TestDeprecationHeaderRestAction.java b/qa/smoke-test-http/src/test/java/org/elasticsearch/http/TestDeprecationHeaderRestAction.java index 8a998a4e535e4..ce0a79691a7a2 100644 --- a/qa/smoke-test-http/src/test/java/org/elasticsearch/http/TestDeprecationHeaderRestAction.java +++ b/qa/smoke-test-http/src/test/java/org/elasticsearch/http/TestDeprecationHeaderRestAction.java @@ -23,7 +23,6 @@ import org.elasticsearch.common.settings.Setting; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.rest.BaseRestHandler; import org.elasticsearch.rest.BytesRestResponse; @@ -83,7 +82,7 @@ public TestDeprecationHeaderRestAction(Settings settings, RestController control public RestChannelConsumer prepareRequest(RestRequest request, NodeClient client) throws IOException { final List settings; - try (XContentParser parser = XContentFactory.xContent(request.content()).createParser(request.content())) { + try (XContentParser parser = request.contentParser()) { final Map source = parser.map(); if (source.containsKey("deprecated_settings")) {