From f41655c365323f9a3d5af13c2087d0a18d02ea3d Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Fri, 24 May 2019 09:21:41 +0100 Subject: [PATCH 1/4] Add option to ObjectParser to consume unknown fields --- .../xcontent/ConstructingObjectParser.java | 1 - .../common/xcontent/ObjectParser.java | 107 ++++++++++++++---- .../common/xcontent/ObjectParserTests.java | 41 ++++++- 3 files changed, 126 insertions(+), 23 deletions(-) diff --git a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ConstructingObjectParser.java b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ConstructingObjectParser.java index 70d867fe5079f..799f2e59a5b72 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ConstructingObjectParser.java +++ b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ConstructingObjectParser.java @@ -149,7 +149,6 @@ public ConstructingObjectParser(String name, boolean ignoreUnknownFields, Functi public ConstructingObjectParser(String name, boolean ignoreUnknownFields, BiFunction builder) { objectParser = new ObjectParser<>(name, ignoreUnknownFields, null); this.builder = builder; - } /** diff --git a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java index ee5e3347f8d99..718425b21c63e 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java +++ b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java @@ -78,14 +78,69 @@ public static BiConsumer> fromLi }; } + private interface UnknownFieldParser { + + /** + * Called when an unknown field is encountered + * @param parserName the parent ObjectParser name + * @param field the name of the unknown field + * @param parser the parser to build values from + */ + void acceptUnknownField(String parserName, String field, XContentParser parser, Value value, Context context) throws IOException; + } + + private static UnknownFieldParser ignoreUnknown() { + return (n, f, x, v, c) -> x.skipChildren(); + } + + private static UnknownFieldParser errorOnUnknown() { + return (n, f, x, v, c) -> { + throw new XContentParseException(x.getTokenLocation(), + "[" + n + "] unknown field [" + f + "], parser not found"); + }; + } + + /** + * Defines how to consume a parsed undefined field + */ + public interface UnknownFieldConsumer { + void accept(Value target, String field, Object value); + } + + private static UnknownFieldParser consumeUnknownField(UnknownFieldConsumer consumer) { + return (parserName, field, parser, value, context) -> { + XContentParser.Token t = parser.currentToken(); + switch (t) { + case VALUE_STRING: + consumer.accept(value, field, parser.text()); + break; + case VALUE_NUMBER: + consumer.accept(value, field, parser.numberValue()); + break; + case VALUE_BOOLEAN: + consumer.accept(value, field, parser.booleanValue()); + break; + case VALUE_NULL: + consumer.accept(value, field, null); + break; + case START_OBJECT: + consumer.accept(value, field, parser.map()); + break; + case START_ARRAY: + consumer.accept(value, field, parser.list()); + break; + default: + throw new XContentParseException(parser.getTokenLocation(), + "[" + parserName + "] cannot parse field [" + field + "] with value type [" + t + "]"); + } + }; + } + private final Map fieldParserMap = new HashMap<>(); private final String name; private final Supplier valueSupplier; - /** - * Should this parser ignore unknown fields? This should generally be set to true only when parsing responses from external systems, - * never when parsing requests from users. - */ - private final boolean ignoreUnknownFields; + + private final UnknownFieldParser unknownFieldParser; /** * Creates a new ObjectParser instance with a name. This name is used to reference the parser in exceptions and messages. @@ -95,25 +150,45 @@ public ObjectParser(String name) { } /** - * Creates a new ObjectParser instance which a name. + * Creates a new ObjectParser instance with a name. * @param name the parsers name, used to reference the parser in exceptions and messages. * @param valueSupplier a supplier that creates a new Value instance used when the parser is used as an inner object parser. */ public ObjectParser(String name, @Nullable Supplier valueSupplier) { - this(name, false, valueSupplier); + this(name, errorOnUnknown(), valueSupplier); } /** - * Creates a new ObjectParser instance which a name. + * Creates a new ObjectParser instance with a name. * @param name the parsers name, used to reference the parser in exceptions and messages. * @param ignoreUnknownFields Should this parser ignore unknown fields? This should generally be set to true only when parsing * responses from external systems, never when parsing requests from users. * @param valueSupplier a supplier that creates a new Value instance used when the parser is used as an inner object parser. */ public ObjectParser(String name, boolean ignoreUnknownFields, @Nullable Supplier valueSupplier) { + this(name, ignoreUnknownFields ? ignoreUnknown() : errorOnUnknown(), valueSupplier); + } + + /** + * Creates a new ObjectParser instance with a name. + * @param name the parsers name, used to reference the parser in exceptions and messages. + * @param unknownFieldConsumer how to consume parsed unknown fields + * @param valueSupplier a supplier that creates a new Value instance used when the parser is used as an inner object parser. + */ + public ObjectParser(String name, UnknownFieldConsumer unknownFieldConsumer, @Nullable Supplier valueSupplier) { + this(name, consumeUnknownField(unknownFieldConsumer), valueSupplier); + } + + /** + * Creates a new ObjectParser instance with a name. + * @param name the parsers name, used to reference the parser in exceptions and messages. + * @param unknownFieldParser how to parse unknown fields + * @param valueSupplier a supplier that creates a new Value instance used when the parser is used as an inner object parser. + */ + private ObjectParser(String name, UnknownFieldParser unknownFieldParser, @Nullable Supplier valueSupplier) { this.name = name; this.valueSupplier = valueSupplier; - this.ignoreUnknownFields = ignoreUnknownFields; + this.unknownFieldParser = unknownFieldParser; } /** @@ -155,14 +230,13 @@ public Value parse(XContentParser parser, Value value, Context context) throws I while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); - fieldParser = getParser(currentFieldName, parser); + fieldParser = fieldParserMap.get(currentFieldName); } else { if (currentFieldName == null) { throw new XContentParseException(parser.getTokenLocation(), "[" + name + "] no field found"); } if (fieldParser == null) { - assert ignoreUnknownFields : "this should only be possible if configured to ignore known fields"; - parser.skipChildren(); // noop if parser points to a value, skips children if parser is start object or start array + unknownFieldParser.acceptUnknownField(name, currentFieldName, parser, value, context); } else { fieldParser.assertSupports(name, parser, currentFieldName); parseSub(parser, fieldParser, currentFieldName, value, context); @@ -363,15 +437,6 @@ private void parseSub(XContentParser parser, FieldParser fieldParser, String cur } } - private FieldParser getParser(String fieldName, XContentParser xContentParser) { - FieldParser parser = fieldParserMap.get(fieldName); - if (parser == null && false == ignoreUnknownFields) { - throw new XContentParseException(xContentParser.getTokenLocation(), - "[" + name + "] unknown field [" + fieldName + "], parser not found"); - } - return parser; - } - private class FieldParser { private final Parser parser; private final EnumSet supportedTokens; diff --git a/libs/x-content/src/test/java/org/elasticsearch/common/xcontent/ObjectParserTests.java b/libs/x-content/src/test/java/org/elasticsearch/common/xcontent/ObjectParserTests.java index e089b8a956ac8..dc48c376fd0e7 100644 --- a/libs/x-content/src/test/java/org/elasticsearch/common/xcontent/ObjectParserTests.java +++ b/libs/x-content/src/test/java/org/elasticsearch/common/xcontent/ObjectParserTests.java @@ -33,7 +33,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.atomic.AtomicReference; import static org.hamcrest.Matchers.containsString; @@ -203,7 +205,7 @@ public void setTest(int test) { { XContentParser parser = createParser(JsonXContent.jsonXContent, "{\"not_supported_field\" : \"foo\"}"); XContentParseException ex = expectThrows(XContentParseException.class, () -> objectParser.parse(parser, s, null)); - assertEquals(ex.getMessage(), "[1:2] [the_parser] unknown field [not_supported_field], parser not found"); + assertEquals(ex.getMessage(), "[1:26] [the_parser] unknown field [not_supported_field], parser not found"); } } @@ -733,4 +735,41 @@ public void setFoo(int foo) { this.foo = foo; } } + + private static class ObjectWithArbitraryFields { + String name; + Map fields = new HashMap<>(); + void setField(String key, Object value) { + fields.put(key, value); + } + void setName(String name) { + this.name = name; + } + } + + public void testConsumeUnknownFields() throws IOException { + XContentParser parser = createParser(JsonXContent.jsonXContent, + "{\n" + + " \"test\" : \"foo\",\n" + + " \"test_number\" : 2,\n" + + " \"name\" : \"geoff\",\n" + + " \"test_boolean\" : true,\n" + + " \"test_null\" : null,\n" + + " \"test_array\": [1,2,3,4],\n" + + " \"test_nested\": { \"field\" : \"value\", \"field2\" : [ \"list1\", \"list2\" ] }\n" + + "}"); + ObjectParser op + = new ObjectParser<>("unknown", ObjectWithArbitraryFields::setField, ObjectWithArbitraryFields::new); + op.declareString(ObjectWithArbitraryFields::setName, new ParseField("name")); + + ObjectWithArbitraryFields o = op.parse(parser, null); + assertEquals("geoff", o.name); + assertEquals(6, o.fields.size()); + assertEquals("foo", o.fields.get("test")); + assertEquals(2, o.fields.get("test_number")); + assertEquals(true, o.fields.get("test_boolean")); + assertNull(o.fields.get("test_null")); + assertEquals(List.of(1, 2, 3, 4), o.fields.get("test_array")); + assertEquals(Map.of("field", "value", "field2", List.of("list1", "list2")), o.fields.get("test_nested")); + } } From 4c839b9368e6ad0f16a9822aba4c757a2864f057 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Fri, 24 May 2019 16:17:19 +0100 Subject: [PATCH 2/4] Change error message to report the same XContentLocation as before --- .../common/xcontent/ObjectParser.java | 24 ++++++++----------- .../common/xcontent/ObjectParserTests.java | 2 +- .../action/update/UpdateRequestTests.java | 4 ++-- .../highlight/HighlightBuilderTests.java | 12 +++++----- .../rescore/QueryRescorerBuilderTests.java | 2 +- .../search/sort/FieldSortBuilderTests.java | 2 +- .../search/sort/ScriptSortBuilderTests.java | 4 ++-- .../core/ml/datafeed/DatafeedConfigTests.java | 2 +- .../xpack/core/ml/job/config/JobTests.java | 2 +- .../output/AutodetectResultsParserTests.java | 2 +- .../common/text/TextTemplateTests.java | 4 ++-- 11 files changed, 28 insertions(+), 32 deletions(-) diff --git a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java index 718425b21c63e..d7d62eba0546f 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java +++ b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java @@ -80,23 +80,17 @@ public static BiConsumer> fromLi private interface UnknownFieldParser { - /** - * Called when an unknown field is encountered - * @param parserName the parent ObjectParser name - * @param field the name of the unknown field - * @param parser the parser to build values from - */ - void acceptUnknownField(String parserName, String field, XContentParser parser, Value value, Context context) throws IOException; + void acceptUnknownField(String parserName, String field, XContentLocation location, XContentParser parser, + Value value, Context context) throws IOException; } private static UnknownFieldParser ignoreUnknown() { - return (n, f, x, v, c) -> x.skipChildren(); + return (n, f, p, x, v, c) -> x.skipChildren(); } - + private static UnknownFieldParser errorOnUnknown() { - return (n, f, x, v, c) -> { - throw new XContentParseException(x.getTokenLocation(), - "[" + n + "] unknown field [" + f + "], parser not found"); + return (n, f, p, x, v, c) -> { + throw new XContentParseException(p, "[" + n + "] unknown field [" + f + "], parser not found"); }; } @@ -108,7 +102,7 @@ public interface UnknownFieldConsumer { } private static UnknownFieldParser consumeUnknownField(UnknownFieldConsumer consumer) { - return (parserName, field, parser, value, context) -> { + return (parserName, field, location, parser, value, context) -> { XContentParser.Token t = parser.currentToken(); switch (t) { case VALUE_STRING: @@ -227,16 +221,18 @@ public Value parse(XContentParser parser, Value value, Context context) throws I FieldParser fieldParser = null; String currentFieldName = null; + XContentLocation currentPosition = null; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { currentFieldName = parser.currentName(); + currentPosition = parser.getTokenLocation(); fieldParser = fieldParserMap.get(currentFieldName); } else { if (currentFieldName == null) { throw new XContentParseException(parser.getTokenLocation(), "[" + name + "] no field found"); } if (fieldParser == null) { - unknownFieldParser.acceptUnknownField(name, currentFieldName, parser, value, context); + unknownFieldParser.acceptUnknownField(name, currentFieldName, currentPosition, parser, value, context); } else { fieldParser.assertSupports(name, parser, currentFieldName); parseSub(parser, fieldParser, currentFieldName, value, context); diff --git a/libs/x-content/src/test/java/org/elasticsearch/common/xcontent/ObjectParserTests.java b/libs/x-content/src/test/java/org/elasticsearch/common/xcontent/ObjectParserTests.java index dc48c376fd0e7..6002c6bd35076 100644 --- a/libs/x-content/src/test/java/org/elasticsearch/common/xcontent/ObjectParserTests.java +++ b/libs/x-content/src/test/java/org/elasticsearch/common/xcontent/ObjectParserTests.java @@ -205,7 +205,7 @@ public void setTest(int test) { { XContentParser parser = createParser(JsonXContent.jsonXContent, "{\"not_supported_field\" : \"foo\"}"); XContentParseException ex = expectThrows(XContentParseException.class, () -> objectParser.parse(parser, s, null)); - assertEquals(ex.getMessage(), "[1:26] [the_parser] unknown field [not_supported_field], parser not found"); + assertEquals(ex.getMessage(), "[1:2] [the_parser] unknown field [not_supported_field], parser not found"); } } diff --git a/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java b/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java index 6549c3a8df5e1..ad4c5ea58b24d 100644 --- a/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java +++ b/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java @@ -288,7 +288,7 @@ public void testUnknownFieldParsing() throws Exception { .endObject()); XContentParseException ex = expectThrows(XContentParseException.class, () -> request.fromXContent(contentParser)); - assertEquals("[1:2] [UpdateRequest] unknown field [unknown_field], parser not found", ex.getMessage()); + assertEquals("[1:18] [UpdateRequest] unknown field [unknown_field], parser not found", ex.getMessage()); UpdateRequest request2 = new UpdateRequest("test", "type", "1"); XContentParser unknownObject = createParser(XContentFactory.jsonBuilder() @@ -299,7 +299,7 @@ public void testUnknownFieldParsing() throws Exception { .endObject() .endObject()); ex = expectThrows(XContentParseException.class, () -> request2.fromXContent(unknownObject)); - assertEquals("[1:76] [UpdateRequest] unknown field [params], parser not found", ex.getMessage()); + assertEquals("[1:85] [UpdateRequest] unknown field [params], parser not found", ex.getMessage()); } public void testFetchSourceParsing() throws Exception { diff --git a/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightBuilderTests.java b/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightBuilderTests.java index 46bca911e9c94..bfc0905c7134f 100644 --- a/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightBuilderTests.java @@ -162,7 +162,7 @@ public void testUnknownArrayNameExpection() throws IOException { XContentParseException e = expectParseThrows(XContentParseException.class, "{\n" + " \"bad_fieldname\" : [ \"field1\" 1 \"field2\" ]\n" + "}\n"); - assertEquals("[2:5] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); + assertEquals("[2:23] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); } { @@ -175,7 +175,7 @@ public void testUnknownArrayNameExpection() throws IOException { "}\n"); assertThat(e.getMessage(), containsString("[highlight] failed to parse field [fields]")); assertThat(e.getCause().getMessage(), containsString("[fields] failed to parse field [body]")); - assertEquals("[4:9] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); + assertEquals("[4:27] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); } } @@ -193,7 +193,7 @@ public void testUnknownFieldnameExpection() throws IOException { XContentParseException e = expectParseThrows(XContentParseException.class, "{\n" + " \"bad_fieldname\" : \"value\"\n" + "}\n"); - assertEquals("[2:5] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); + assertEquals("[2:23] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); } { @@ -206,7 +206,7 @@ public void testUnknownFieldnameExpection() throws IOException { "}\n"); assertThat(e.getMessage(), containsString("[highlight] failed to parse field [fields]")); assertThat(e.getCause().getMessage(), containsString("[fields] failed to parse field [body]")); - assertEquals("[4:9] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); + assertEquals("[4:27] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); } } @@ -218,7 +218,7 @@ public void testUnknownObjectFieldnameExpection() throws IOException { XContentParseException e = expectParseThrows(XContentParseException.class, "{\n" + " \"bad_fieldname\" : { \"field\" : \"value\" }\n \n" + "}\n"); - assertEquals("[2:5] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); + assertEquals("[2:24] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); } { @@ -231,7 +231,7 @@ public void testUnknownObjectFieldnameExpection() throws IOException { "}\n"); assertThat(e.getMessage(), containsString("[highlight] failed to parse field [fields]")); assertThat(e.getCause().getMessage(), containsString("[fields] failed to parse field [body]")); - assertEquals("[4:9] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); + assertEquals("[4:27] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); } } diff --git a/server/src/test/java/org/elasticsearch/search/rescore/QueryRescorerBuilderTests.java b/server/src/test/java/org/elasticsearch/search/rescore/QueryRescorerBuilderTests.java index 0f647353e95af..4d8ae349ffeed 100644 --- a/server/src/test/java/org/elasticsearch/search/rescore/QueryRescorerBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/rescore/QueryRescorerBuilderTests.java @@ -251,7 +251,7 @@ public void testUnknownFieldsExpection() throws IOException { "}\n"; try (XContentParser parser = createParser(rescoreElement)) { XContentParseException e = expectThrows(XContentParseException.class, () -> RescorerBuilder.parseFromXContent(parser)); - assertEquals("[3:17] [query] unknown field [bad_fieldname], parser not found", e.getMessage()); + assertEquals("[3:35] [query] unknown field [bad_fieldname], parser not found", e.getMessage()); } rescoreElement = "{\n" + diff --git a/server/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java b/server/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java index ee9c8f8ed1105..ae9b0f8b4e90d 100644 --- a/server/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java @@ -318,7 +318,7 @@ public void testUnknownOptionFails() throws IOException { parser.nextToken(); XContentParseException e = expectThrows(XContentParseException.class, () -> FieldSortBuilder.fromXContent(parser, "")); - assertEquals("[1:18] [field_sort] unknown field [reverse], parser not found", e.getMessage()); + assertEquals("[1:30] [field_sort] unknown field [reverse], parser not found", e.getMessage()); } } diff --git a/server/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java b/server/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java index 3017a2e0c067d..66886a83f47bd 100644 --- a/server/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java @@ -227,7 +227,7 @@ public void testParseBadFieldNameExceptions() throws IOException { parser.nextToken(); XContentParseException e = expectThrows(XContentParseException.class, () -> ScriptSortBuilder.fromXContent(parser, null)); - assertEquals("[1:15] [_script] unknown field [bad_field], parser not found", e.getMessage()); + assertEquals("[1:29] [_script] unknown field [bad_field], parser not found", e.getMessage()); } } @@ -240,7 +240,7 @@ public void testParseBadFieldNameExceptionsOnStartObject() throws IOException { parser.nextToken(); XContentParseException e = expectThrows(XContentParseException.class, () -> ScriptSortBuilder.fromXContent(parser, null)); - assertEquals("[1:15] [_script] unknown field [bad_field], parser not found", e.getMessage()); + assertEquals("[1:29] [_script] unknown field [bad_field], parser not found", e.getMessage()); } } diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/datafeed/DatafeedConfigTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/datafeed/DatafeedConfigTests.java index 062504cbfdc3c..54024688ecdf1 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/datafeed/DatafeedConfigTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/datafeed/DatafeedConfigTests.java @@ -268,7 +268,7 @@ public void testFutureConfigParse() throws IOException { .createParser(xContentRegistry(), DeprecationHandler.THROW_UNSUPPORTED_OPERATION, FUTURE_DATAFEED); XContentParseException e = expectThrows(XContentParseException.class, () -> DatafeedConfig.STRICT_PARSER.apply(parser, null).build()); - assertEquals("[6:5] [datafeed_config] unknown field [tomorrows_technology_today], parser not found", e.getMessage()); + assertEquals("[6:35] [datafeed_config] unknown field [tomorrows_technology_today], parser not found", e.getMessage()); } public void testPastQueryConfigParse() throws IOException { diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/JobTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/JobTests.java index 47e96f8b5ada2..3701a6f7c33ad 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/JobTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/JobTests.java @@ -81,7 +81,7 @@ public void testFutureConfigParse() throws IOException { .createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, FUTURE_JOB); XContentParseException e = expectThrows(XContentParseException.class, () -> Job.STRICT_PARSER.apply(parser, null).build()); - assertEquals("[4:5] [job_details] unknown field [tomorrows_technology_today], parser not found", e.getMessage()); + assertEquals("[4:35] [job_details] unknown field [tomorrows_technology_today], parser not found", e.getMessage()); } public void testFutureMetadataParse() throws IOException { diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/output/AutodetectResultsParserTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/output/AutodetectResultsParserTests.java index 1118453154ed8..8d97cf95458ce 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/output/AutodetectResultsParserTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/output/AutodetectResultsParserTests.java @@ -390,7 +390,7 @@ public void testParse_GivenUnknownObject() throws ElasticsearchParseException, I XContentParseException e = expectThrows(XContentParseException.class, () -> parser.parseResults(inputStream).forEachRemaining(a -> { })); - assertEquals("[1:3] [autodetect_result] unknown field [unknown], parser not found", e.getMessage()); + assertEquals("[1:13] [autodetect_result] unknown field [unknown], parser not found", e.getMessage()); } } diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/text/TextTemplateTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/text/TextTemplateTests.java index ecc071d598105..8e39019ccc6eb 100644 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/text/TextTemplateTests.java +++ b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/text/TextTemplateTests.java @@ -210,7 +210,7 @@ public void testParserInvalidUnknownScriptType() throws Exception { XContentParser parser = createParser(JsonXContent.jsonXContent, bytes); parser.nextToken(); XContentParseException ex = expectThrows(XContentParseException.class, () -> TextTemplate.parse(parser)); - assertEquals("[1:2] [script] unknown field [template], parser not found", ex.getMessage()); + assertEquals("[1:13] [script] unknown field [template], parser not found", ex.getMessage()); } public void testParserInvalidMissingText() throws Exception { @@ -222,7 +222,7 @@ public void testParserInvalidMissingText() throws Exception { XContentParser parser = createParser(JsonXContent.jsonXContent, bytes); parser.nextToken(); XContentParseException ex = expectThrows(XContentParseException.class, () -> TextTemplate.parse(parser)); - assertEquals("[1:2] [script] unknown field [type], parser not found", ex.getMessage()); + assertEquals("[1:9] [script] unknown field [type], parser not found", ex.getMessage()); } public void testNullObject() throws Exception { From 68d9ff15cfd684dab42ee8b3a729e977e3fe9632 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Fri, 24 May 2019 16:21:30 +0100 Subject: [PATCH 3/4] Reset tests --- .../common/xcontent/ConstructingObjectParser.java | 1 + .../action/update/UpdateRequestTests.java | 4 ++-- .../subphase/highlight/HighlightBuilderTests.java | 12 ++++++------ .../search/rescore/QueryRescorerBuilderTests.java | 2 +- .../search/sort/FieldSortBuilderTests.java | 2 +- .../search/sort/ScriptSortBuilderTests.java | 4 ++-- .../xpack/core/ml/datafeed/DatafeedConfigTests.java | 2 +- .../xpack/core/ml/job/config/JobTests.java | 2 +- .../output/AutodetectResultsParserTests.java | 2 +- .../xpack/watcher/common/text/TextTemplateTests.java | 4 ++-- 10 files changed, 18 insertions(+), 17 deletions(-) diff --git a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ConstructingObjectParser.java b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ConstructingObjectParser.java index 799f2e59a5b72..70d867fe5079f 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ConstructingObjectParser.java +++ b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ConstructingObjectParser.java @@ -149,6 +149,7 @@ public ConstructingObjectParser(String name, boolean ignoreUnknownFields, Functi public ConstructingObjectParser(String name, boolean ignoreUnknownFields, BiFunction builder) { objectParser = new ObjectParser<>(name, ignoreUnknownFields, null); this.builder = builder; + } /** diff --git a/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java b/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java index ad4c5ea58b24d..6549c3a8df5e1 100644 --- a/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java +++ b/server/src/test/java/org/elasticsearch/action/update/UpdateRequestTests.java @@ -288,7 +288,7 @@ public void testUnknownFieldParsing() throws Exception { .endObject()); XContentParseException ex = expectThrows(XContentParseException.class, () -> request.fromXContent(contentParser)); - assertEquals("[1:18] [UpdateRequest] unknown field [unknown_field], parser not found", ex.getMessage()); + assertEquals("[1:2] [UpdateRequest] unknown field [unknown_field], parser not found", ex.getMessage()); UpdateRequest request2 = new UpdateRequest("test", "type", "1"); XContentParser unknownObject = createParser(XContentFactory.jsonBuilder() @@ -299,7 +299,7 @@ public void testUnknownFieldParsing() throws Exception { .endObject() .endObject()); ex = expectThrows(XContentParseException.class, () -> request2.fromXContent(unknownObject)); - assertEquals("[1:85] [UpdateRequest] unknown field [params], parser not found", ex.getMessage()); + assertEquals("[1:76] [UpdateRequest] unknown field [params], parser not found", ex.getMessage()); } public void testFetchSourceParsing() throws Exception { diff --git a/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightBuilderTests.java b/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightBuilderTests.java index bfc0905c7134f..46bca911e9c94 100644 --- a/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/fetch/subphase/highlight/HighlightBuilderTests.java @@ -162,7 +162,7 @@ public void testUnknownArrayNameExpection() throws IOException { XContentParseException e = expectParseThrows(XContentParseException.class, "{\n" + " \"bad_fieldname\" : [ \"field1\" 1 \"field2\" ]\n" + "}\n"); - assertEquals("[2:23] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); + assertEquals("[2:5] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); } { @@ -175,7 +175,7 @@ public void testUnknownArrayNameExpection() throws IOException { "}\n"); assertThat(e.getMessage(), containsString("[highlight] failed to parse field [fields]")); assertThat(e.getCause().getMessage(), containsString("[fields] failed to parse field [body]")); - assertEquals("[4:27] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); + assertEquals("[4:9] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); } } @@ -193,7 +193,7 @@ public void testUnknownFieldnameExpection() throws IOException { XContentParseException e = expectParseThrows(XContentParseException.class, "{\n" + " \"bad_fieldname\" : \"value\"\n" + "}\n"); - assertEquals("[2:23] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); + assertEquals("[2:5] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); } { @@ -206,7 +206,7 @@ public void testUnknownFieldnameExpection() throws IOException { "}\n"); assertThat(e.getMessage(), containsString("[highlight] failed to parse field [fields]")); assertThat(e.getCause().getMessage(), containsString("[fields] failed to parse field [body]")); - assertEquals("[4:27] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); + assertEquals("[4:9] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); } } @@ -218,7 +218,7 @@ public void testUnknownObjectFieldnameExpection() throws IOException { XContentParseException e = expectParseThrows(XContentParseException.class, "{\n" + " \"bad_fieldname\" : { \"field\" : \"value\" }\n \n" + "}\n"); - assertEquals("[2:24] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); + assertEquals("[2:5] [highlight] unknown field [bad_fieldname], parser not found", e.getMessage()); } { @@ -231,7 +231,7 @@ public void testUnknownObjectFieldnameExpection() throws IOException { "}\n"); assertThat(e.getMessage(), containsString("[highlight] failed to parse field [fields]")); assertThat(e.getCause().getMessage(), containsString("[fields] failed to parse field [body]")); - assertEquals("[4:27] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); + assertEquals("[4:9] [highlight_field] unknown field [bad_fieldname], parser not found", e.getCause().getCause().getMessage()); } } diff --git a/server/src/test/java/org/elasticsearch/search/rescore/QueryRescorerBuilderTests.java b/server/src/test/java/org/elasticsearch/search/rescore/QueryRescorerBuilderTests.java index 4d8ae349ffeed..0f647353e95af 100644 --- a/server/src/test/java/org/elasticsearch/search/rescore/QueryRescorerBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/rescore/QueryRescorerBuilderTests.java @@ -251,7 +251,7 @@ public void testUnknownFieldsExpection() throws IOException { "}\n"; try (XContentParser parser = createParser(rescoreElement)) { XContentParseException e = expectThrows(XContentParseException.class, () -> RescorerBuilder.parseFromXContent(parser)); - assertEquals("[3:35] [query] unknown field [bad_fieldname], parser not found", e.getMessage()); + assertEquals("[3:17] [query] unknown field [bad_fieldname], parser not found", e.getMessage()); } rescoreElement = "{\n" + diff --git a/server/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java b/server/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java index ae9b0f8b4e90d..ee9c8f8ed1105 100644 --- a/server/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java @@ -318,7 +318,7 @@ public void testUnknownOptionFails() throws IOException { parser.nextToken(); XContentParseException e = expectThrows(XContentParseException.class, () -> FieldSortBuilder.fromXContent(parser, "")); - assertEquals("[1:30] [field_sort] unknown field [reverse], parser not found", e.getMessage()); + assertEquals("[1:18] [field_sort] unknown field [reverse], parser not found", e.getMessage()); } } diff --git a/server/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java b/server/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java index 66886a83f47bd..3017a2e0c067d 100644 --- a/server/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java @@ -227,7 +227,7 @@ public void testParseBadFieldNameExceptions() throws IOException { parser.nextToken(); XContentParseException e = expectThrows(XContentParseException.class, () -> ScriptSortBuilder.fromXContent(parser, null)); - assertEquals("[1:29] [_script] unknown field [bad_field], parser not found", e.getMessage()); + assertEquals("[1:15] [_script] unknown field [bad_field], parser not found", e.getMessage()); } } @@ -240,7 +240,7 @@ public void testParseBadFieldNameExceptionsOnStartObject() throws IOException { parser.nextToken(); XContentParseException e = expectThrows(XContentParseException.class, () -> ScriptSortBuilder.fromXContent(parser, null)); - assertEquals("[1:29] [_script] unknown field [bad_field], parser not found", e.getMessage()); + assertEquals("[1:15] [_script] unknown field [bad_field], parser not found", e.getMessage()); } } diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/datafeed/DatafeedConfigTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/datafeed/DatafeedConfigTests.java index 54024688ecdf1..062504cbfdc3c 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/datafeed/DatafeedConfigTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/datafeed/DatafeedConfigTests.java @@ -268,7 +268,7 @@ public void testFutureConfigParse() throws IOException { .createParser(xContentRegistry(), DeprecationHandler.THROW_UNSUPPORTED_OPERATION, FUTURE_DATAFEED); XContentParseException e = expectThrows(XContentParseException.class, () -> DatafeedConfig.STRICT_PARSER.apply(parser, null).build()); - assertEquals("[6:35] [datafeed_config] unknown field [tomorrows_technology_today], parser not found", e.getMessage()); + assertEquals("[6:5] [datafeed_config] unknown field [tomorrows_technology_today], parser not found", e.getMessage()); } public void testPastQueryConfigParse() throws IOException { diff --git a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/JobTests.java b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/JobTests.java index 3701a6f7c33ad..47e96f8b5ada2 100644 --- a/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/JobTests.java +++ b/x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/job/config/JobTests.java @@ -81,7 +81,7 @@ public void testFutureConfigParse() throws IOException { .createParser(NamedXContentRegistry.EMPTY, DeprecationHandler.THROW_UNSUPPORTED_OPERATION, FUTURE_JOB); XContentParseException e = expectThrows(XContentParseException.class, () -> Job.STRICT_PARSER.apply(parser, null).build()); - assertEquals("[4:35] [job_details] unknown field [tomorrows_technology_today], parser not found", e.getMessage()); + assertEquals("[4:5] [job_details] unknown field [tomorrows_technology_today], parser not found", e.getMessage()); } public void testFutureMetadataParse() throws IOException { diff --git a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/output/AutodetectResultsParserTests.java b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/output/AutodetectResultsParserTests.java index 8d97cf95458ce..1118453154ed8 100644 --- a/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/output/AutodetectResultsParserTests.java +++ b/x-pack/plugin/ml/src/test/java/org/elasticsearch/xpack/ml/job/process/autodetect/output/AutodetectResultsParserTests.java @@ -390,7 +390,7 @@ public void testParse_GivenUnknownObject() throws ElasticsearchParseException, I XContentParseException e = expectThrows(XContentParseException.class, () -> parser.parseResults(inputStream).forEachRemaining(a -> { })); - assertEquals("[1:13] [autodetect_result] unknown field [unknown], parser not found", e.getMessage()); + assertEquals("[1:3] [autodetect_result] unknown field [unknown], parser not found", e.getMessage()); } } diff --git a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/text/TextTemplateTests.java b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/text/TextTemplateTests.java index 8e39019ccc6eb..ecc071d598105 100644 --- a/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/text/TextTemplateTests.java +++ b/x-pack/plugin/watcher/src/test/java/org/elasticsearch/xpack/watcher/common/text/TextTemplateTests.java @@ -210,7 +210,7 @@ public void testParserInvalidUnknownScriptType() throws Exception { XContentParser parser = createParser(JsonXContent.jsonXContent, bytes); parser.nextToken(); XContentParseException ex = expectThrows(XContentParseException.class, () -> TextTemplate.parse(parser)); - assertEquals("[1:13] [script] unknown field [template], parser not found", ex.getMessage()); + assertEquals("[1:2] [script] unknown field [template], parser not found", ex.getMessage()); } public void testParserInvalidMissingText() throws Exception { @@ -222,7 +222,7 @@ public void testParserInvalidMissingText() throws Exception { XContentParser parser = createParser(JsonXContent.jsonXContent, bytes); parser.nextToken(); XContentParseException ex = expectThrows(XContentParseException.class, () -> TextTemplate.parse(parser)); - assertEquals("[1:9] [script] unknown field [type], parser not found", ex.getMessage()); + assertEquals("[1:2] [script] unknown field [type], parser not found", ex.getMessage()); } public void testNullObject() throws Exception { From fa0e18d0b4dc0116ec1b4b3e8e392ca95a042663 Mon Sep 17 00:00:00 2001 From: Alan Woodward Date: Fri, 31 May 2019 09:06:41 +0100 Subject: [PATCH 4/4] Fix lambda short parameter list --- .../org/elasticsearch/common/xcontent/ObjectParser.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java index d7d62eba0546f..c80c5bdb0d09a 100644 --- a/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java +++ b/libs/x-content/src/main/java/org/elasticsearch/common/xcontent/ObjectParser.java @@ -85,12 +85,12 @@ void acceptUnknownField(String parserName, String field, XContentLocation locati } private static UnknownFieldParser ignoreUnknown() { - return (n, f, p, x, v, c) -> x.skipChildren(); + return (n, f, l, p, v, c) -> p.skipChildren(); } private static UnknownFieldParser errorOnUnknown() { - return (n, f, p, x, v, c) -> { - throw new XContentParseException(p, "[" + n + "] unknown field [" + f + "], parser not found"); + return (n, f, l, p, v, c) -> { + throw new XContentParseException(l, "[" + n + "] unknown field [" + f + "], parser not found"); }; }