Skip to content

Commit f6877c0

Browse files
committed
Add JsonParser.getText(Writer) impl for xml backend
1 parent 3a8fd77 commit f6877c0

File tree

2 files changed

+88
-63
lines changed

2 files changed

+88
-63
lines changed

src/main/java/com/fasterxml/jackson/dataformat/xml/deser/FromXmlParser.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.fasterxml.jackson.dataformat.xml.deser;
22

33
import java.io.IOException;
4+
import java.io.Writer;
45
import java.math.BigDecimal;
56
import java.math.BigInteger;
67
import java.util.Set;
@@ -813,6 +814,17 @@ public boolean hasTextCharacters()
813814
return false;
814815
}
815816

817+
@Override // since 2.8
818+
public int getText(Writer writer) throws IOException
819+
{
820+
String str = getText();
821+
if (str == null) {
822+
return 0;
823+
}
824+
writer.write(str);
825+
return str.length();
826+
}
827+
816828
/*
817829
/**********************************************************
818830
/* Public API, access to token information, binary

src/test/java/com/fasterxml/jackson/dataformat/xml/stream/XmlParserTest.java

Lines changed: 76 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.fasterxml.jackson.dataformat.xml.XmlTestBase;
1111
import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser;
1212

13-
1413
public class XmlParserTest extends XmlTestBase
1514
{
1615
/*
@@ -76,74 +75,74 @@ public void testRoundTripWithSample() throws Exception
7675
// Former could be worked around; latter less so at this point.
7776

7877
// So, for now, let's just do sort of minimal verification, manually
79-
JsonParser jp = _xmlMapper.getFactory().createParser(xml);
78+
JsonParser p = _xmlMapper.getFactory().createParser(xml);
8079

81-
assertToken(JsonToken.START_OBJECT, jp.nextToken()); // main object
82-
83-
assertToken(JsonToken.FIELD_NAME, jp.nextToken()); // 'Image'
84-
verifyFieldName(jp, "Image");
85-
assertToken(JsonToken.START_OBJECT, jp.nextToken()); // 'image' object
86-
assertToken(JsonToken.FIELD_NAME, jp.nextToken()); // 'Width'
87-
verifyFieldName(jp, "Width");
88-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
89-
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_WIDTH), jp.getText());
90-
assertToken(JsonToken.FIELD_NAME, jp.nextToken()); // 'Height'
91-
verifyFieldName(jp, "Height");
92-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
93-
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_HEIGHT), jp.getText());
94-
assertToken(JsonToken.FIELD_NAME, jp.nextToken()); // 'Title'
95-
verifyFieldName(jp, "Title");
96-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
97-
assertEquals(SAMPLE_SPEC_VALUE_TITLE, getAndVerifyText(jp));
98-
assertToken(JsonToken.FIELD_NAME, jp.nextToken()); // 'Thumbnail'
99-
verifyFieldName(jp, "Thumbnail");
100-
assertToken(JsonToken.START_OBJECT, jp.nextToken()); // 'thumbnail' object
101-
assertToken(JsonToken.FIELD_NAME, jp.nextToken()); // 'Url'
102-
verifyFieldName(jp, "Url");
103-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
104-
assertEquals(SAMPLE_SPEC_VALUE_TN_URL, getAndVerifyText(jp));
105-
assertToken(JsonToken.FIELD_NAME, jp.nextToken()); // 'Height'
106-
verifyFieldName(jp, "Height");
107-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
108-
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_HEIGHT), jp.getText());
109-
assertToken(JsonToken.FIELD_NAME, jp.nextToken()); // 'Width'
110-
verifyFieldName(jp, "Width");
80+
assertToken(JsonToken.START_OBJECT, p.nextToken()); // main object
81+
82+
assertToken(JsonToken.FIELD_NAME, p.nextToken()); // 'Image'
83+
verifyFieldName(p, "Image");
84+
assertToken(JsonToken.START_OBJECT, p.nextToken()); // 'image' object
85+
assertToken(JsonToken.FIELD_NAME, p.nextToken()); // 'Width'
86+
verifyFieldName(p, "Width");
87+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
88+
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_WIDTH), p.getText());
89+
assertToken(JsonToken.FIELD_NAME, p.nextToken()); // 'Height'
90+
verifyFieldName(p, "Height");
91+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
92+
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_HEIGHT), p.getText());
93+
assertToken(JsonToken.FIELD_NAME, p.nextToken()); // 'Title'
94+
verifyFieldName(p, "Title");
95+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
96+
assertEquals(SAMPLE_SPEC_VALUE_TITLE, getAndVerifyText(p));
97+
assertToken(JsonToken.FIELD_NAME, p.nextToken()); // 'Thumbnail'
98+
verifyFieldName(p, "Thumbnail");
99+
assertToken(JsonToken.START_OBJECT, p.nextToken()); // 'thumbnail' object
100+
assertToken(JsonToken.FIELD_NAME, p.nextToken()); // 'Url'
101+
verifyFieldName(p, "Url");
102+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
103+
assertEquals(SAMPLE_SPEC_VALUE_TN_URL, getAndVerifyText(p));
104+
assertToken(JsonToken.FIELD_NAME, p.nextToken()); // 'Height'
105+
verifyFieldName(p, "Height");
106+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
107+
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_HEIGHT), p.getText());
108+
assertToken(JsonToken.FIELD_NAME, p.nextToken()); // 'Width'
109+
verifyFieldName(p, "Width");
111110
// Width value is actually a String in the example
112-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
113-
assertEquals(SAMPLE_SPEC_VALUE_TN_WIDTH, getAndVerifyText(jp));
111+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
112+
assertEquals(SAMPLE_SPEC_VALUE_TN_WIDTH, getAndVerifyText(p));
114113

115-
assertToken(JsonToken.END_OBJECT, jp.nextToken()); // 'thumbnail' object
114+
assertToken(JsonToken.END_OBJECT, p.nextToken()); // 'thumbnail' object
116115

117116
// Note: arrays are "eaten"; wrapping is done using BeanPropertyWriter, so:
118-
//assertToken(JsonToken.FIELD_NAME, jp.nextToken()); // 'IDs'
119-
//verifyFieldName(jp, "IDs");
120-
//assertToken(JsonToken.START_OBJECT, jp.nextToken()); // 'ids' array
121-
122-
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
123-
verifyFieldName(jp, "IDs");
124-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
125-
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_ID1), getAndVerifyText(jp));
126-
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
127-
verifyFieldName(jp, "IDs");
128-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
129-
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_ID2), getAndVerifyText(jp));
130-
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
131-
verifyFieldName(jp, "IDs");
132-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
133-
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_ID3), getAndVerifyText(jp));
134-
assertToken(JsonToken.FIELD_NAME, jp.nextToken());
135-
verifyFieldName(jp, "IDs");
136-
assertToken(JsonToken.VALUE_STRING, jp.nextToken());
137-
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_ID4), getAndVerifyText(jp));
117+
//assertToken(JsonToken.FIELD_NAME, p.nextToken()); // 'IDs'
118+
//verifyFieldName(p, "IDs");
119+
//assertToken(JsonToken.START_OBJECT, p.nextToken()); // 'ids' array
120+
121+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
122+
verifyFieldName(p, "IDs");
123+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
124+
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_ID1), getAndVerifyText(p));
125+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
126+
verifyFieldName(p, "IDs");
127+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
128+
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_ID2), getAndVerifyText(p));
129+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
130+
verifyFieldName(p, "IDs");
131+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
132+
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_ID3), getAndVerifyText(p));
133+
assertToken(JsonToken.FIELD_NAME, p.nextToken());
134+
verifyFieldName(p, "IDs");
135+
assertToken(JsonToken.VALUE_STRING, p.nextToken());
136+
assertEquals(String.valueOf(SAMPLE_SPEC_VALUE_TN_ID4), getAndVerifyText(p));
138137

139138
// no matching entry for array:
140-
//assertToken(JsonToken.END_OBJECT, jp.nextToken()); // 'ids' array
139+
//assertToken(JsonToken.END_OBJECT, p.nextToken()); // 'ids' array
141140

142-
assertToken(JsonToken.END_OBJECT, jp.nextToken()); // 'image' object
141+
assertToken(JsonToken.END_OBJECT, p.nextToken()); // 'image' object
143142

144-
assertToken(JsonToken.END_OBJECT, jp.nextToken()); // main object
143+
assertToken(JsonToken.END_OBJECT, p.nextToken()); // main object
145144

146-
jp.close();
145+
p.close();
147146
}
148147

149148
/**
@@ -202,6 +201,11 @@ public void testForceElementAsArray() throws Exception
202201
assertEquals("property", xp.getCurrentName());
203202
assertToken(JsonToken.VALUE_STRING, xp.nextToken());
204203
assertEquals("123", xp.getText());
204+
205+
StringWriter w = new StringWriter();
206+
assertEquals(3, xp.getText(w));
207+
assertEquals("123", w.toString());
208+
205209
assertTrue(xp.getParsingContext().inObject());
206210
assertToken(JsonToken.END_OBJECT, xp.nextToken()); // </property>
207211
assertTrue(xp.getParsingContext().inArray());
@@ -237,9 +241,18 @@ public void testXmlAttributes() throws Exception
237241

238242
assertToken(JsonToken.FIELD_NAME, xp.nextToken()); // <offset>
239243
assertEquals("offset", xp.getCurrentName());
244+
245+
StringWriter w = new StringWriter();
246+
assertEquals(6, xp.getText(w));
247+
assertEquals("offset", w.toString());
248+
240249
assertToken(JsonToken.VALUE_STRING, xp.nextToken());
241250
assertEquals("9", xp.getText());
242251

252+
w = new StringWriter();
253+
assertEquals(1, xp.getText(w));
254+
assertEquals("9", w.toString());
255+
243256
assertToken(JsonToken.END_OBJECT, xp.nextToken()); // </data>
244257
xp.close();
245258
}
@@ -248,12 +261,12 @@ private String _readXmlWriteJson(String xml) throws IOException
248261
{
249262
StringWriter w = new StringWriter();
250263

251-
JsonParser jp = _xmlFactory.createParser(xml);
264+
JsonParser p = _xmlFactory.createParser(xml);
252265
JsonGenerator jg = _jsonFactory.createGenerator(w);
253-
while (jp.nextToken() != null) {
254-
jg.copyCurrentEvent(jp);
266+
while (p.nextToken() != null) {
267+
jg.copyCurrentEvent(p);
255268
}
256-
jp.close();
269+
p.close();
257270
jg.close();
258271
return w.toString();
259272
}

0 commit comments

Comments
 (0)