Class ObjectParser<Value,Context>
- java.lang.Object
-
- org.elasticsearch.common.xcontent.AbstractObjectParser<Value,Context>
-
- org.elasticsearch.common.xcontent.ObjectParser<Value,Context>
-
- All Implemented Interfaces:
java.util.function.BiFunction<XContentParser,Context,Value>
,ContextParser<Context,Value>
public final class ObjectParser<Value,Context> extends AbstractObjectParser<Value,Context>
A declarative, stateless parser that turns XContent into setter calls. A single parser should be defined for each object being parsed, nested elements can be added viaAbstractObjectParser.declareObject(BiConsumer, ContextParser, ParseField)
which should be satisfied where possible by passing another instance ofObjectParser
, this one customized for that Object.This class works well for object that do have a constructor argument or that can be built using information available from earlier in the XContent. For objects that have constructors with required arguments that are specified on the same level as other fields see
ConstructingObjectParser
.Instances of
ObjectParser
should be setup by declaring a constant field for the parsers and declaring all fields in a static block just below the creation of the parser. Like this:
It's highly recommended to use the high level declare methods likeprivate static final ObjectParser<Thing, SomeContext> PARSER = new ObjectParser<>("thing", Thing::new)); static { PARSER.declareInt(Thing::setMineral, new ParseField("mineral")); PARSER.declareInt(Thing::setFruit, new ParseField("fruit")); }
AbstractObjectParser.declareString(BiConsumer, ParseField)
instead ofdeclareField(org.elasticsearch.common.xcontent.ObjectParser.Parser<Value, Context>, org.elasticsearch.common.ParseField, org.elasticsearch.common.xcontent.ObjectParser.ValueType)
which can be used to implement exceptional parsing operations not covered by the high level methods.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
ObjectParser.NamedObjectParser<T,Context>
Functional interface for instantiating and parsing named objects.static interface
ObjectParser.Parser<Value,Context>
static class
ObjectParser.ValueType
-
Constructor Summary
Constructors Constructor Description ObjectParser(java.lang.String name)
Creates a new ObjectParser instance with a name.ObjectParser(java.lang.String name, boolean ignoreUnknownFields, java.util.function.Supplier<Value> valueSupplier)
Creates a new ObjectParser instance which a name.ObjectParser(java.lang.String name, java.util.function.Supplier<Value> valueSupplier)
Creates a new ObjectParser instance which a name.
-
Method Summary
Modifier and Type Method Description Value
apply(XContentParser parser, Context context)
<T> void
declareField(java.util.function.BiConsumer<Value,T> consumer, ContextParser<Context,T> parser, ParseField parseField, ObjectParser.ValueType type)
Declare some field.void
declareField(ObjectParser.Parser<Value,Context> p, ParseField parseField, ObjectParser.ValueType type)
<T> void
declareNamedObjects(java.util.function.BiConsumer<Value,java.util.List<T>> consumer, ObjectParser.NamedObjectParser<T,Context> namedObjectParser, java.util.function.Consumer<Value> orderedModeCallback, ParseField field)
Declares named objects in the style of highlighting's field element.<T> void
declareNamedObjects(java.util.function.BiConsumer<Value,java.util.List<T>> consumer, ObjectParser.NamedObjectParser<T,Context> namedObjectParser, ParseField field)
Declares named objects in the style of aggregations.<T> void
declareObjectOrDefault(java.util.function.BiConsumer<Value,T> consumer, java.util.function.BiFunction<XContentParser,Context,T> objectParser, java.util.function.Supplier<T> defaultValue, ParseField field)
static <Value,ElementValue>
java.util.function.BiConsumer<Value,java.util.List<ElementValue>>fromList(java.lang.Class<ElementValue> c, java.util.function.BiConsumer<Value,ElementValue[]> consumer)
Adapts an array (or varags) setter into a list setter.java.lang.String
getName()
Get the name of the parser.Value
parse(XContentParser parser, Context context)
Parses a Value from the givenXContentParser
Value
parse(XContentParser parser, Value value, Context context)
Parses a Value from the givenXContentParser
java.lang.String
toString()
-
Methods inherited from class org.elasticsearch.common.xcontent.AbstractObjectParser
declareBoolean, declareDouble, declareDoubleArray, declareField, declareFieldArray, declareFloat, declareFloatArray, declareInt, declareIntArray, declareLong, declareLongArray, declareObject, declareObjectArray, declareString, declareStringArray, declareStringOrNull
-
-
-
-
Constructor Detail
-
ObjectParser
public ObjectParser(java.lang.String name)
Creates a new ObjectParser instance with a name. This name is used to reference the parser in exceptions and messages.
-
ObjectParser
public ObjectParser(java.lang.String name, @Nullable java.util.function.Supplier<Value> valueSupplier)
Creates a new ObjectParser instance which a name.- Parameters:
name
- the parsers name, used to reference the parser in exceptions and messages.valueSupplier
- a supplier that creates a new Value instance used when the parser is used as an inner object parser.
-
ObjectParser
public ObjectParser(java.lang.String name, boolean ignoreUnknownFields, @Nullable java.util.function.Supplier<Value> valueSupplier)
Creates a new ObjectParser instance which a name.- Parameters:
name
- the parsers name, used to reference the parser in exceptions and messages.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.valueSupplier
- a supplier that creates a new Value instance used when the parser is used as an inner object parser.
-
-
Method Detail
-
fromList
public static <Value,ElementValue> java.util.function.BiConsumer<Value,java.util.List<ElementValue>> fromList(java.lang.Class<ElementValue> c, java.util.function.BiConsumer<Value,ElementValue[]> consumer)
Adapts an array (or varags) setter into a list setter.
-
parse
public Value parse(XContentParser parser, Context context) throws java.io.IOException
Parses a Value from the givenXContentParser
- Parameters:
parser
- the parser to build a value fromcontext
- context needed for parsing- Returns:
- a new value instance drawn from the provided value supplier on
ObjectParser(String, Supplier)
- Throws:
java.io.IOException
- if an IOException occurs.
-
parse
public Value parse(XContentParser parser, Value value, Context context) throws java.io.IOException
Parses a Value from the givenXContentParser
- Parameters:
parser
- the parser to build a value fromvalue
- the value to fill from the parsercontext
- a context that is passed along to all declared field parsers- Returns:
- the parsed value
- Throws:
java.io.IOException
- if an IOException occurs.
-
apply
public Value apply(XContentParser parser, Context context)
-
declareField
public void declareField(ObjectParser.Parser<Value,Context> p, ParseField parseField, ObjectParser.ValueType type)
-
declareField
public <T> void declareField(java.util.function.BiConsumer<Value,T> consumer, ContextParser<Context,T> parser, ParseField parseField, ObjectParser.ValueType type)
Description copied from class:AbstractObjectParser
Declare some field. Usually it is easier to useAbstractObjectParser.declareString(BiConsumer, ParseField)
orAbstractObjectParser.declareObject(BiConsumer, ContextParser, ParseField)
rather than call this directly.- Specified by:
declareField
in classAbstractObjectParser<Value,Context>
-
declareObjectOrDefault
public <T> void declareObjectOrDefault(java.util.function.BiConsumer<Value,T> consumer, java.util.function.BiFunction<XContentParser,Context,T> objectParser, java.util.function.Supplier<T> defaultValue, ParseField field)
-
declareNamedObjects
public <T> void declareNamedObjects(java.util.function.BiConsumer<Value,java.util.List<T>> consumer, ObjectParser.NamedObjectParser<T,Context> namedObjectParser, java.util.function.Consumer<Value> orderedModeCallback, ParseField field)
Description copied from class:AbstractObjectParser
Declares named objects in the style of highlighting's field element. These are usually named inside and object like this:{ "highlight": { "fields": { <------ this one "title": {}, "body": {}, "category": {} } } }
{ "highlight": { "fields": [ <------ this one {"title": {}}, {"body": {}}, {"category": {}} ] } }
- Specified by:
declareNamedObjects
in classAbstractObjectParser<Value,Context>
- Parameters:
consumer
- sets the values once they have been parsednamedObjectParser
- parses each named objectorderedModeCallback
- called when the named object is parsed using the "ordered" mode (the array of objects)field
- the field to parse
-
declareNamedObjects
public <T> void declareNamedObjects(java.util.function.BiConsumer<Value,java.util.List<T>> consumer, ObjectParser.NamedObjectParser<T,Context> namedObjectParser, ParseField field)
Description copied from class:AbstractObjectParser
Declares named objects in the style of aggregations. These are named inside and object like this:{ "aggregations": { "name_1": { "aggregation_type": {} }, "name_2": { "aggregation_type": {} }, "name_3": { "aggregation_type": {} } } } }
- Specified by:
declareNamedObjects
in classAbstractObjectParser<Value,Context>
- Parameters:
consumer
- sets the values once they have been parsednamedObjectParser
- parses each named objectfield
- the field to parse
-
getName
public java.lang.String getName()
Get the name of the parser.- Specified by:
getName
in classAbstractObjectParser<Value,Context>
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
-