66package org .elasticsearch .xpack .core .enrich ;
77
88import org .elasticsearch .common .ParseField ;
9+ import org .elasticsearch .common .ParsingException ;
910import org .elasticsearch .common .Strings ;
1011import org .elasticsearch .common .bytes .BytesReference ;
1112import org .elasticsearch .common .io .stream .StreamInput ;
1718import org .elasticsearch .common .xcontent .XContentBuilder ;
1819import org .elasticsearch .common .xcontent .XContentHelper ;
1920import org .elasticsearch .common .xcontent .XContentParser ;
21+ import org .elasticsearch .common .xcontent .XContentParser .Token ;
2022import org .elasticsearch .common .xcontent .XContentType ;
2123
2224import java .io .IOException ;
@@ -34,20 +36,21 @@ public final class EnrichPolicy implements Writeable, ToXContentFragment {
3436 public static final String EXACT_MATCH_TYPE = "exact_match" ;
3537 public static final String [] SUPPORTED_POLICY_TYPES = new String []{EXACT_MATCH_TYPE };
3638
37- private static final ParseField TYPE = new ParseField ("type" );
3839 private static final ParseField QUERY = new ParseField ("query" );
3940 private static final ParseField INDICES = new ParseField ("indices" );
4041 private static final ParseField MATCH_FIELD = new ParseField ("match_field" );
4142 private static final ParseField ENRICH_FIELDS = new ParseField ("enrich_fields" );
4243
4344 @ SuppressWarnings ("unchecked" )
44- private static final ConstructingObjectParser <EnrichPolicy , Void > PARSER = new ConstructingObjectParser <>("policy" ,
45- args -> new EnrichPolicy (
46- (String ) args [0 ],
47- (QuerySource ) args [1 ],
48- (List <String >) args [2 ],
49- (String ) args [3 ],
50- (List <String >) args [4 ]
45+ private static final ConstructingObjectParser <EnrichPolicy , String > PARSER = new ConstructingObjectParser <>(
46+ "policy" ,
47+ false ,
48+ (args , policyType ) -> new EnrichPolicy (
49+ policyType ,
50+ (QuerySource ) args [0 ],
51+ (List <String >) args [1 ],
52+ (String ) args [2 ],
53+ (List <String >) args [3 ]
5154 )
5255 );
5356
@@ -56,7 +59,6 @@ public final class EnrichPolicy implements Writeable, ToXContentFragment {
5659 }
5760
5861 private static void declareParserOptions (ConstructingObjectParser <?, ?> parser ) {
59- parser .declareString (ConstructingObjectParser .constructorArg (), TYPE );
6062 parser .declareObject (ConstructingObjectParser .optionalConstructorArg (), (p , c ) -> {
6163 XContentBuilder contentBuilder = XContentBuilder .builder (p .contentType ().xContent ());
6264 contentBuilder .generator ().copyCurrentStructure (p );
@@ -68,7 +70,24 @@ private static void declareParserOptions(ConstructingObjectParser<?, ?> parser)
6870 }
6971
7072 public static EnrichPolicy fromXContent (XContentParser parser ) throws IOException {
71- return PARSER .parse (parser , null );
73+ Token token = parser .currentToken ();
74+ if (token != Token .START_OBJECT ) {
75+ token = parser .nextToken ();
76+ }
77+ if (token != Token .START_OBJECT ) {
78+ throw new ParsingException (parser .getTokenLocation (), "unexpected token" );
79+ }
80+ token = parser .nextToken ();
81+ if (token != Token .FIELD_NAME ) {
82+ throw new ParsingException (parser .getTokenLocation (), "unexpected token" );
83+ }
84+ String policyType = parser .currentName ();
85+ EnrichPolicy policy = PARSER .parse (parser , policyType );
86+ token = parser .nextToken ();
87+ if (token != Token .END_OBJECT ) {
88+ throw new ParsingException (parser .getTokenLocation (), "unexpected token" );
89+ }
90+ return policy ;
7291 }
7392
7493 private final String type ;
@@ -134,14 +153,21 @@ public void writeTo(StreamOutput out) throws IOException {
134153
135154 @ Override
136155 public XContentBuilder toXContent (XContentBuilder builder , Params params ) throws IOException {
137- builder .field (TYPE .getPreferredName (), type );
156+ builder .startObject (type );
157+ {
158+ toInnerXContent (builder );
159+ }
160+ builder .endObject ();
161+ return builder ;
162+ }
163+
164+ private void toInnerXContent (XContentBuilder builder ) throws IOException {
138165 if (query != null ) {
139166 builder .field (QUERY .getPreferredName (), query .getQueryAsMap ());
140167 }
141168 builder .array (INDICES .getPreferredName (), indices .toArray (new String [0 ]));
142169 builder .field (MATCH_FIELD .getPreferredName (), matchField );
143170 builder .array (ENRICH_FIELDS .getPreferredName (), enrichFields .toArray (new String [0 ]));
144- return builder ;
145171 }
146172
147173 @ Override
@@ -222,14 +248,16 @@ public static class NamedPolicy implements Writeable, ToXContent {
222248
223249 static final ParseField NAME = new ParseField ("name" );
224250 @ SuppressWarnings ("unchecked" )
225- static final ConstructingObjectParser <NamedPolicy , Void > PARSER = new ConstructingObjectParser <>("named_policy" ,
226- args -> new NamedPolicy (
251+ static final ConstructingObjectParser <NamedPolicy , String > PARSER = new ConstructingObjectParser <>(
252+ "named_policy" ,
253+ false ,
254+ (args , policyType ) -> new NamedPolicy (
227255 (String ) args [0 ],
228- new EnrichPolicy (( String ) args [ 1 ] ,
229- (QuerySource ) args [2 ],
230- (List <String >) args [3 ],
231- (String ) args [4 ],
232- (List <String >) args [5 ])
256+ new EnrichPolicy (policyType ,
257+ (QuerySource ) args [1 ],
258+ (List <String >) args [2 ],
259+ (String ) args [3 ],
260+ (List <String >) args [4 ])
233261 )
234262 );
235263
@@ -268,16 +296,39 @@ public void writeTo(StreamOutput out) throws IOException {
268296 @ Override
269297 public XContentBuilder toXContent (XContentBuilder builder , Params params ) throws IOException {
270298 builder .startObject ();
299+ builder .startObject (policy .type );
271300 {
272301 builder .field (NAME .getPreferredName (), name );
273- policy .toXContent (builder , params );
302+ policy .toInnerXContent (builder );
274303 }
275304 builder .endObject ();
305+ builder .endObject ();
276306 return builder ;
277307 }
278308
279309 public static NamedPolicy fromXContent (XContentParser parser ) throws IOException {
280- return PARSER .parse (parser , null );
310+ Token token = parser .currentToken ();
311+ if (token != Token .START_OBJECT ) {
312+ token = parser .nextToken ();
313+ }
314+ if (token != Token .START_OBJECT ) {
315+ throw new ParsingException (parser .getTokenLocation (), "unexpected token" );
316+ }
317+ token = parser .nextToken ();
318+ if (token != Token .FIELD_NAME ) {
319+ throw new ParsingException (parser .getTokenLocation (), "unexpected token" );
320+ }
321+ String policyType = parser .currentName ();
322+ token = parser .nextToken ();
323+ if (token != Token .START_OBJECT ) {
324+ throw new ParsingException (parser .getTokenLocation (), "unexpected token" );
325+ }
326+ NamedPolicy policy = PARSER .parse (parser , policyType );
327+ token = parser .nextToken ();
328+ if (token != Token .END_OBJECT ) {
329+ throw new ParsingException (parser .getTokenLocation (), "unexpected token" );
330+ }
331+ return policy ;
281332 }
282333
283334 @ Override
0 commit comments