diff options
author | Tim Vernum <tim@adjective.org> | 2017-04-27 20:26:10 +1000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-27 20:26:10 +1000 |
commit | 65f90b25e0e2306ed53cad6c01e07875a0000a6c (patch) | |
tree | 9c608ab60cef618d4093f9e7de2691fad8efb91a /core/src/test/java/org/elasticsearch/common | |
parent | 8a8410b5ceac748b50424b62a99e4c312719c33f (diff) |
Pass Context to ConstructingObjectParser's function (#24230)
Allow the `Context` to be used in the builder function used within ConstructingObjectParser.
This facilitates scenarios where a constructor argument comes from a URL parameter, or from document id.
Diffstat (limited to 'core/src/test/java/org/elasticsearch/common')
-rw-r--r-- | core/src/test/java/org/elasticsearch/common/xcontent/ConstructingObjectParserTests.java | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/core/src/test/java/org/elasticsearch/common/xcontent/ConstructingObjectParserTests.java b/core/src/test/java/org/elasticsearch/common/xcontent/ConstructingObjectParserTests.java index 7f6187800c..3f3e8496b2 100644 --- a/core/src/test/java/org/elasticsearch/common/xcontent/ConstructingObjectParserTests.java +++ b/core/src/test/java/org/elasticsearch/common/xcontent/ConstructingObjectParserTests.java @@ -303,6 +303,18 @@ public class ConstructingObjectParserTests extends ESTestCase { assertEquals(s.test, "foo"); } + public void testConstructObjectUsingContext() throws IOException { + XContentParser parser = createParser(JsonXContent.jsonXContent, + "{\n" + + " \"animal\": \"dropbear\",\n" + + " \"mineral\": -8\n" + + "}"); + HasCtorArguments parsed = HasCtorArguments.PARSER_INT_CONTEXT.apply(parser, 42); + assertEquals(Integer.valueOf(42), parsed.vegetable); + assertEquals("dropbear", parsed.animal); + assertEquals(-8, parsed.mineral); + } + private static class HasCtorArguments implements ToXContent { @Nullable final String animal; @@ -381,22 +393,37 @@ public class ConstructingObjectParserTests extends ESTestCase { public static final ConstructingObjectParser<HasCtorArguments, Void> PARSER = buildParser(true, true); public static final ConstructingObjectParser<HasCtorArguments, Void> PARSER_VEGETABLE_OPTIONAL = buildParser(true, false); public static final ConstructingObjectParser<HasCtorArguments, Void> PARSER_ALL_OPTIONAL = buildParser(false, false); + public static final List<ConstructingObjectParser<HasCtorArguments, Void>> ALL_PARSERS = unmodifiableList( Arrays.asList(PARSER, PARSER_VEGETABLE_OPTIONAL, PARSER_ALL_OPTIONAL)); + public static final ConstructingObjectParser<HasCtorArguments, Integer> PARSER_INT_CONTEXT = buildContextParser(); + private static ConstructingObjectParser<HasCtorArguments, Void> buildParser(boolean animalRequired, boolean vegetableRequired) { ConstructingObjectParser<HasCtorArguments, Void> parser = new ConstructingObjectParser<>( "has_required_arguments", a -> new HasCtorArguments((String) a[0], (Integer) a[1])); parser.declareString(animalRequired ? constructorArg() : optionalConstructorArg(), new ParseField("animal")); parser.declareInt(vegetableRequired ? constructorArg() : optionalConstructorArg(), new ParseField("vegetable")); + declareSetters(parser); + return parser; + } + + private static ConstructingObjectParser<HasCtorArguments, Integer> buildContextParser() { + ConstructingObjectParser<HasCtorArguments, Integer> parser = new ConstructingObjectParser<>( + "has_required_arguments", false, (args, ctx) -> new HasCtorArguments((String) args[0], ctx)); + parser.declareString(constructorArg(), new ParseField("animal")); + declareSetters(parser); + return parser; + } + + private static void declareSetters(ConstructingObjectParser<HasCtorArguments, ?> parser) { parser.declareInt(HasCtorArguments::setMineral, new ParseField("mineral")); parser.declareInt(HasCtorArguments::setFruit, new ParseField("fruit")); parser.declareString(HasCtorArguments::setA, new ParseField("a")); parser.declareString(HasCtorArguments::setB, new ParseField("b")); parser.declareString(HasCtorArguments::setC, new ParseField("c")); parser.declareBoolean(HasCtorArguments::setD, new ParseField("d")); - return parser; } } |