Skip to content

Commit 5b32f81

Browse files
committed
Fix #482 (related to #481 and #480) for 2.12(.4)
1 parent 84b59aa commit 5b32f81

File tree

5 files changed

+81
-2
lines changed

5 files changed

+81
-2
lines changed

pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,15 @@ alternative support for serializing POJOs as XML and deserializing XML as pojos.
109109
<version>2.3.2</version>
110110
<scope>test</scope>
111111
</dependency>
112+
<!-- 03-Jul-2021, tatu: For sanity checking of non-Woodstox impl usage
113+
need, say, Sjsxp
114+
-->
115+
<dependency>
116+
<groupId>com.sun.xml.stream</groupId>
117+
<artifactId>sjsxp</artifactId>
118+
<version>1.0.2</version>
119+
<scope>test</scope>
120+
</dependency>
112121

113122
<dependency>
114123
<groupId>junit</groupId>

release-notes/CREDITS-2.x

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,8 @@ Westin Miller (westinrm@github)
155155

156156
* Contributed #456: Fix JsonAlias with unwrapped lists
157157
(2.12.3)
158+
159+
Tim Jacomb (timja@github)
160+
161+
* Reported #482: Use of non-Stax2-compatible Stax2 implementation fails when reading
162+
(2.12.4)

release-notes/VERSION-2.x

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ Project: jackson-dataformat-xml
1111
#473: Parsing of `null` Integer fields changed behavior between versions
1212
2.11.4 and 2.12.X
1313
(reported by Steviep@github)
14+
#482: Use of non-Stax2-compatible Stax2 implementation fails when reading
15+
from byte[]
16+
(reported by Tim J)
1417

1518
2.12.3 (12-Apr-2021)
1619

src/main/java/com/fasterxml/jackson/dataformat/xml/XmlFactory.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import javax.xml.stream.*;
66

7+
import org.codehaus.stax2.XMLInputFactory2;
78
import org.codehaus.stax2.io.Stax2ByteArraySource;
89
import org.codehaus.stax2.io.Stax2CharArraySource;
910

@@ -610,7 +611,13 @@ protected FromXmlParser _createParser(char[] data, int offset, int len, IOContex
610611
// is always same as if 'false' was passed
611612
XMLStreamReader sr;
612613
try {
613-
sr = _xmlInputFactory.createXMLStreamReader(new Stax2CharArraySource(data, offset, len));
614+
// 03-Jul-2021, tatu: [dataformat-xml#482] non-Stax2 impls unlikely to
615+
// support so avoid:
616+
if (_xmlInputFactory instanceof XMLInputFactory2) {
617+
sr = _xmlInputFactory.createXMLStreamReader(new Stax2CharArraySource(data, offset, len));
618+
} else {
619+
sr = _xmlInputFactory.createXMLStreamReader(new CharArrayReader(data, offset, len));
620+
}
614621
} catch (XMLStreamException e) {
615622
return StaxUtil.throwAsParseException(e, null);
616623
}
@@ -628,7 +635,13 @@ protected FromXmlParser _createParser(byte[] data, int offset, int len, IOContex
628635
{
629636
XMLStreamReader sr;
630637
try {
631-
sr = _xmlInputFactory.createXMLStreamReader(new Stax2ByteArraySource(data, offset, len));
638+
// 03-Jul-2021, tatu: [dataformat-xml#482] non-Stax2 impls unlikely to
639+
// support so avoid:
640+
if (_xmlInputFactory instanceof XMLInputFactory2) {
641+
sr = _xmlInputFactory.createXMLStreamReader(new Stax2ByteArraySource(data, offset, len));
642+
} else {
643+
sr = _xmlInputFactory.createXMLStreamReader(new ByteArrayInputStream(data, offset, len));
644+
}
632645
} catch (XMLStreamException e) {
633646
return StaxUtil.throwAsParseException(e, null);
634647
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.fasterxml.jackson.dataformat.xml.interop;
2+
3+
import com.fasterxml.jackson.core.JsonParser;
4+
import com.fasterxml.jackson.databind.ObjectReader;
5+
import com.fasterxml.jackson.dataformat.xml.XmlFactory;
6+
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
7+
import com.fasterxml.jackson.dataformat.xml.XmlTestBase;
8+
import com.sun.xml.stream.ZephyrParserFactory;
9+
import com.sun.xml.stream.ZephyrWriterFactory;
10+
11+
// to verify issue behind [dataformat-xml#482]
12+
public class NonWoodstoxStaxImpl482Test extends XmlTestBase
13+
{
14+
static class Root {
15+
public int value = 3;
16+
}
17+
18+
private final XmlMapper SJSXP_MAPPER = XmlMapper.builder(
19+
XmlFactory.builder()
20+
.inputFactory(new ZephyrParserFactory())
21+
.outputFactory(new ZephyrWriterFactory())
22+
.build())
23+
.build();
24+
25+
// [dataformat-xml#482]
26+
public void testSjsxpFromByteArray() throws Exception
27+
{
28+
byte[] xml0 = SJSXP_MAPPER.writeValueAsBytes(new Root());
29+
// and just for fun, ensure offset handling works:
30+
byte[] xml = new byte[xml0.length + 10];
31+
System.arraycopy(xml0, 0, xml, 5, xml0.length);
32+
Root result = SJSXP_MAPPER.readValue(xml, 5, xml0.length, Root.class);
33+
assertNotNull(result);
34+
}
35+
36+
// [dataformat-xml#482]
37+
public void testSjsxpFromCharArray() throws Exception
38+
{
39+
char[] xml0 = SJSXP_MAPPER.writeValueAsString(new Root()).toCharArray();
40+
// add offset
41+
char[] xml = new char[xml0.length + 10];
42+
System.arraycopy(xml0, 0, xml, 5, xml0.length);
43+
ObjectReader r = SJSXP_MAPPER.readerFor(Root.class);
44+
JsonParser p = r.createParser(xml, 5, xml0.length);
45+
Root result = r.readValue(p);
46+
p.close();
47+
assertNotNull(result);
48+
}
49+
}

0 commit comments

Comments
 (0)