1010package org .elasticsearch .ingest ;
1111
1212import org .apache .lucene .util .BytesRef ;
13+ import org .elasticsearch .common .bytes .BytesArray ;
1314import org .elasticsearch .common .bytes .BytesReference ;
14- import org .elasticsearch .common .io .stream .BytesStreamOutput ;
15+ import org .elasticsearch .common .io .stream .RecyclerBytesStreamOutput ;
1516import org .elasticsearch .common .recycler .Recycler ;
16- import org .elasticsearch .transport .BytesRefRecycler ;
1717import org .elasticsearch .xcontent .XContentBuilder ;
1818import org .elasticsearch .xcontent .XContentParser ;
1919import org .elasticsearch .xcontent .XContentString ;
2020
21+ import java .io .ByteArrayOutputStream ;
2122import java .io .IOException ;
2223import java .math .BigDecimal ;
2324import java .math .BigInteger ;
2829public class ESONSource {
2930
3031 public static class Builder {
31- private final BytesStreamOutput bytes ;
32+ private final Recycler < BytesRef > refRecycler ;
3233 private final List <ESONEntry > keyArray ;
3334
3435 public Builder () {
3536 this (0 );
3637 }
3738
3839 public Builder (int expectedSize ) {
39- this (BytesRefRecycler . NON_RECYCLING_INSTANCE , expectedSize );
40+ this (ESONFlat . getBytesRefRecycler () , expectedSize );
4041 }
4142
4243 public Builder (Recycler <BytesRef > refRecycler , int expectedSize ) {
43- this .bytes = new BytesStreamOutput ( expectedSize ) ;
44+ this .refRecycler = refRecycler ;
4445 this .keyArray = new ArrayList <>();
4546 }
4647
@@ -50,13 +51,21 @@ public ESONIndexed.ESONObject parse(XContentParser parser) throws IOException {
5051 throw new IllegalArgumentException ("Expected START_OBJECT but got " + token );
5152 }
5253
53- parseObject (parser , bytes , keyArray , null );
54+ try (RecyclerBytesStreamOutput bytes = new RecyclerBytesStreamOutput (refRecycler )) {
55+ parseObject (parser , bytes , keyArray , null );
56+ ByteArrayOutputStream bao = new ByteArrayOutputStream (bytes .size ());
57+ bytes .bytes ().writeTo (bao );
58+ return new ESONIndexed .ESONObject (0 , new ESONFlat (keyArray , new Values (new BytesArray (bao .toByteArray ()))));
59+ }
5460
55- return new ESONIndexed .ESONObject (0 , new ESONFlat (keyArray , new Values (bytes .bytes ())));
5661 }
5762
58- private static void parseObject (XContentParser parser , BytesStreamOutput bytes , List <ESONEntry > keyArray , String objectFieldName )
59- throws IOException {
63+ private static void parseObject (
64+ XContentParser parser ,
65+ RecyclerBytesStreamOutput bytes ,
66+ List <ESONEntry > keyArray ,
67+ String objectFieldName
68+ ) throws IOException {
6069 ESONEntry .ObjectEntry objEntry = new ESONEntry .ObjectEntry (objectFieldName );
6170 keyArray .add (objEntry );
6271
@@ -70,8 +79,12 @@ private static void parseObject(XContentParser parser, BytesStreamOutput bytes,
7079 objEntry .offsetOrCount (count );
7180 }
7281
73- private static void parseArray (XContentParser parser , BytesStreamOutput bytes , List <ESONEntry > keyArray , String arrayFieldName )
74- throws IOException {
82+ private static void parseArray (
83+ XContentParser parser ,
84+ RecyclerBytesStreamOutput bytes ,
85+ List <ESONEntry > keyArray ,
86+ String arrayFieldName
87+ ) throws IOException {
7588 ESONEntry .ArrayEntry arrEntry = new ESONEntry .ArrayEntry (arrayFieldName );
7689 keyArray .add (arrEntry );
7790
@@ -92,7 +105,7 @@ private static void parseArray(XContentParser parser, BytesStreamOutput bytes, L
92105 arrEntry .offsetOrCount (count );
93106 }
94107
95- private static void parseValue (XContentParser parser , String fieldName , BytesStreamOutput bytes , List <ESONEntry > keyArray )
108+ private static void parseValue (XContentParser parser , String fieldName , RecyclerBytesStreamOutput bytes , List <ESONEntry > keyArray )
96109 throws IOException {
97110 XContentParser .Token token = parser .nextToken ();
98111
@@ -106,7 +119,7 @@ private static void parseValue(XContentParser parser, String fieldName, BytesStr
106119 }
107120 }
108121
109- private static Value parseSimpleValue (XContentParser parser , BytesStreamOutput bytes , XContentParser .Token token )
122+ private static Value parseSimpleValue (XContentParser parser , RecyclerBytesStreamOutput bytes , XContentParser .Token token )
110123 throws IOException {
111124 long position = bytes .position ();
112125
0 commit comments