11/*
2+ * Elemental
3+ * Copyright (C) 2024, Evolved Binary Ltd
4+ *
5+ 6+ * https://www.evolvedbinary.com | https://www.elemental.xyz
7+ *
8+ * This library is free software; you can redistribute it and/or
9+ * modify it under the terms of the GNU Lesser General Public
10+ * License as published by the Free Software Foundation; version 2.1.
11+ *
12+ * This library is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+ * Lesser General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU Lesser General Public
18+ * License along with this library; if not, write to the Free Software
19+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20+ *
21+ * NOTE: Parts of this file contain code from 'The eXist-db Authors'.
22+ * The original license header is included below.
23+ *
24+ * =====================================================================
25+ *
226 * eXist-db Open Source Native XML Database
327 * Copyright (C) 2001 The eXist-db Authors
428 *
2448import com .fasterxml .jackson .core .JsonFactory ;
2549import com .fasterxml .jackson .core .JsonGenerator ;
2650import io .lacuna .bifurcan .IEntry ;
51+ import org .apache .commons .io .output .StringBuilderWriter ;
2752import org .exist .storage .DBBroker ;
2853import org .exist .storage .serializers .EXistOutputKeys ;
2954import org .exist .storage .serializers .Serializer ;
@@ -69,7 +94,11 @@ public void serialize(Sequence sequence, Writer writer) throws SAXException {
6994 } else {
7095 generator .disable (JsonGenerator .Feature .STRICT_DUPLICATE_DETECTION );
7196 }
72- serializeSequence (sequence , generator );
97+
98+ try (final StringBuilderWriter sbWriter = new StringBuilderWriter ()) {
99+ serializeSequence (sequence , generator , sbWriter );
100+ }
101+
73102 if ("yes" .equals (outputProperties .getProperty (EXistOutputKeys .INSERT_FINAL_NEWLINE , "no" ))) {
74103 generator .writeRaw ('\n' );
75104 }
@@ -79,25 +108,25 @@ public void serialize(Sequence sequence, Writer writer) throws SAXException {
79108 }
80109 }
81110
82- private void serializeSequence (Sequence sequence , JsonGenerator generator ) throws IOException , XPathException , SAXException {
111+ private void serializeSequence (final Sequence sequence , final JsonGenerator generator , final StringBuilderWriter sbWriter ) throws IOException , XPathException , SAXException {
83112 if (sequence .isEmpty ()) {
84113 generator .writeNull ();
85114 } else if (sequence .hasOne () && "no" .equals (outputProperties .getProperty (EXistOutputKeys .JSON_ARRAY_OUTPUT , "no" ))) {
86- serializeItem (sequence .itemAt (0 ), generator );
115+ serializeItem (sequence .itemAt (0 ), generator , sbWriter );
87116 } else {
88117 generator .writeStartArray ();
89- for (SequenceIterator i = sequence .iterate (); i .hasNext (); ) {
90- serializeItem (i .nextItem (), generator );
118+ for (final SequenceIterator i = sequence .iterate (); i .hasNext (); ) {
119+ serializeItem (i .nextItem (), generator , sbWriter );
91120 }
92121 generator .writeEndArray ();
93122 }
94123 }
95124
96- private void serializeItem (Item item , JsonGenerator generator ) throws IOException , XPathException , SAXException {
125+ private void serializeItem (final Item item , final JsonGenerator generator , final StringBuilderWriter sbWriter ) throws IOException , XPathException , SAXException {
97126 if (item .getType () == Type .ARRAY ) {
98- serializeArray ((ArrayType ) item , generator );
127+ serializeArray ((ArrayType ) item , generator , sbWriter );
99128 } else if (item .getType () == Type .MAP ) {
100- serializeMap ((MapType ) item , generator );
129+ serializeMap ((MapType ) item , generator , sbWriter );
101130 } else if (Type .subTypeOf (item .getType (), Type .ATOMIC )) {
102131 if (Type .subTypeOfUnion (item .getType (), Type .NUMBER )) {
103132 generator .writeNumber (item .getStringValue ());
@@ -112,40 +141,42 @@ private void serializeItem(Item item, JsonGenerator generator) throws IOExceptio
112141 }
113142 }
114143 } else if (Type .subTypeOf (item .getType (), Type .NODE )) {
115- serializeNode (item , generator );
144+ serializeNode (item , generator , sbWriter );
116145 }
117146 }
118147
119- private void serializeNode (Item item , JsonGenerator generator ) throws SAXException {
148+ private void serializeNode (final Item item , final JsonGenerator generator , final StringBuilderWriter sbWriter ) throws SAXException {
120149 final Serializer serializer = broker .borrowSerializer ();
121150 final Properties xmlOutput = new Properties ();
122151 xmlOutput .setProperty (OutputKeys .METHOD , outputProperties .getProperty (EXistOutputKeys .JSON_NODE_OUTPUT_METHOD , "xml" ));
123152 xmlOutput .setProperty (OutputKeys .OMIT_XML_DECLARATION , "yes" );
124153 xmlOutput .setProperty (OutputKeys .INDENT , outputProperties .getProperty (OutputKeys .INDENT , "no" ));
125154 try {
126155 serializer .setProperties (xmlOutput );
127- generator .writeString (serializer .serialize ((NodeValue )item ));
156+ sbWriter .getBuilder ().setLength (0 );
157+ serializer .serialize ((NodeValue ) item , sbWriter );
158+ generator .writeString (sbWriter .toString ());
128159 } catch (IOException e ) {
129160 throw new SAXException (e .getMessage (), e );
130161 } finally {
131162 broker .returnSerializer (serializer );
132163 }
133164 }
134165
135- private void serializeArray (ArrayType array , JsonGenerator generator ) throws IOException , XPathException , SAXException {
166+ private void serializeArray (final ArrayType array , final JsonGenerator generator , final StringBuilderWriter sbWriter ) throws IOException , XPathException , SAXException {
136167 generator .writeStartArray ();
137168 for (int i = 0 ; i < array .getSize (); i ++) {
138169 final Sequence member = array .get (i );
139- serializeSequence (member , generator );
170+ serializeSequence (member , generator , sbWriter );
140171 }
141172 generator .writeEndArray ();
142173 }
143174
144- private void serializeMap (MapType map , JsonGenerator generator ) throws IOException , XPathException , SAXException {
175+ private void serializeMap (final MapType map , final JsonGenerator generator , final StringBuilderWriter sbWriter ) throws IOException , XPathException , SAXException {
145176 generator .writeStartObject ();
146177 for (final IEntry <AtomicValue , Sequence > entry : map ) {
147178 generator .writeFieldName (entry .key ().getStringValue ());
148- serializeSequence (entry .value (), generator );
179+ serializeSequence (entry .value (), generator , sbWriter );
149180 }
150181 generator .writeEndObject ();
151182 }
0 commit comments