1
1
/*
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
+ *
2
26
* eXist-db Open Source Native XML Database
3
27
* Copyright (C) 2001 The eXist-db Authors
4
28
*
24
48
import com .fasterxml .jackson .core .JsonFactory ;
25
49
import com .fasterxml .jackson .core .JsonGenerator ;
26
50
import io .lacuna .bifurcan .IEntry ;
51
+ import org .apache .commons .io .output .StringBuilderWriter ;
27
52
import org .exist .storage .DBBroker ;
28
53
import org .exist .storage .serializers .EXistOutputKeys ;
29
54
import org .exist .storage .serializers .Serializer ;
@@ -69,7 +94,11 @@ public void serialize(Sequence sequence, Writer writer) throws SAXException {
69
94
} else {
70
95
generator .disable (JsonGenerator .Feature .STRICT_DUPLICATE_DETECTION );
71
96
}
72
- serializeSequence (sequence , generator );
97
+
98
+ try (final StringBuilderWriter sbWriter = new StringBuilderWriter ()) {
99
+ serializeSequence (sequence , generator , sbWriter );
100
+ }
101
+
73
102
if ("yes" .equals (outputProperties .getProperty (EXistOutputKeys .INSERT_FINAL_NEWLINE , "no" ))) {
74
103
generator .writeRaw ('\n' );
75
104
}
@@ -79,25 +108,25 @@ public void serialize(Sequence sequence, Writer writer) throws SAXException {
79
108
}
80
109
}
81
110
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 {
83
112
if (sequence .isEmpty ()) {
84
113
generator .writeNull ();
85
114
} 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 );
87
116
} else {
88
117
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 );
91
120
}
92
121
generator .writeEndArray ();
93
122
}
94
123
}
95
124
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 {
97
126
if (item .getType () == Type .ARRAY_ITEM ) {
98
- serializeArray ((ArrayType ) item , generator );
127
+ serializeArray ((ArrayType ) item , generator , sbWriter );
99
128
} else if (item .getType () == Type .MAP_ITEM ) {
100
- serializeMap ((MapType ) item , generator );
129
+ serializeMap ((MapType ) item , generator , sbWriter );
101
130
} else if (Type .subTypeOf (item .getType (), Type .ANY_ATOMIC_TYPE )) {
102
131
if (Type .subTypeOfUnion (item .getType (), Type .NUMERIC )) {
103
132
generator .writeNumber (item .getStringValue ());
@@ -112,40 +141,42 @@ private void serializeItem(Item item, JsonGenerator generator) throws IOExceptio
112
141
}
113
142
}
114
143
} else if (Type .subTypeOf (item .getType (), Type .NODE )) {
115
- serializeNode (item , generator );
144
+ serializeNode (item , generator , sbWriter );
116
145
}
117
146
}
118
147
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 {
120
149
final Serializer serializer = broker .borrowSerializer ();
121
150
final Properties xmlOutput = new Properties ();
122
151
xmlOutput .setProperty (OutputKeys .METHOD , outputProperties .getProperty (EXistOutputKeys .JSON_NODE_OUTPUT_METHOD , "xml" ));
123
152
xmlOutput .setProperty (OutputKeys .OMIT_XML_DECLARATION , "yes" );
124
153
xmlOutput .setProperty (OutputKeys .INDENT , outputProperties .getProperty (OutputKeys .INDENT , "no" ));
125
154
try {
126
155
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 ());
128
159
} catch (IOException e ) {
129
160
throw new SAXException (e .getMessage (), e );
130
161
} finally {
131
162
broker .returnSerializer (serializer );
132
163
}
133
164
}
134
165
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 {
136
167
generator .writeStartArray ();
137
168
for (int i = 0 ; i < array .getSize (); i ++) {
138
169
final Sequence member = array .get (i );
139
- serializeSequence (member , generator );
170
+ serializeSequence (member , generator , sbWriter );
140
171
}
141
172
generator .writeEndArray ();
142
173
}
143
174
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 {
145
176
generator .writeStartObject ();
146
177
for (final IEntry <AtomicValue , Sequence > entry : map ) {
147
178
generator .writeFieldName (entry .key ().getStringValue ());
148
- serializeSequence (entry .value (), generator );
179
+ serializeSequence (entry .value (), generator , sbWriter );
149
180
}
150
181
generator .writeEndObject ();
151
182
}
0 commit comments