Skip to content

Commit

Permalink
Fix #482 (related to #481 and #480) for 2.12(.4)
Browse files Browse the repository at this point in the history
  • Loading branch information
cowtowncoder committed Jul 4, 2021
1 parent 84b59aa commit 5b32f81
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 2 deletions.
9 changes: 9 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,15 @@ alternative support for serializing POJOs as XML and deserializing XML as pojos.
<version>2.3.2</version>
<scope>test</scope>
</dependency>
<!-- 03-Jul-2021, tatu: For sanity checking of non-Woodstox impl usage
need, say, Sjsxp
-->
<dependency>
<groupId>com.sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
<version>1.0.2</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
Expand Down
5 changes: 5 additions & 0 deletions release-notes/CREDITS-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -155,3 +155,8 @@ Westin Miller (westinrm@github)

* Contributed #456: Fix JsonAlias with unwrapped lists
(2.12.3)

Tim Jacomb (timja@github)

* Reported #482: Use of non-Stax2-compatible Stax2 implementation fails when reading
(2.12.4)
3 changes: 3 additions & 0 deletions release-notes/VERSION-2.x
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ Project: jackson-dataformat-xml
#473: Parsing of `null` Integer fields changed behavior between versions
2.11.4 and 2.12.X
(reported by Steviep@github)
#482: Use of non-Stax2-compatible Stax2 implementation fails when reading
from byte[]
(reported by Tim J)

2.12.3 (12-Apr-2021)

Expand Down
17 changes: 15 additions & 2 deletions src/main/java/com/fasterxml/jackson/dataformat/xml/XmlFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import javax.xml.stream.*;

import org.codehaus.stax2.XMLInputFactory2;
import org.codehaus.stax2.io.Stax2ByteArraySource;
import org.codehaus.stax2.io.Stax2CharArraySource;

Expand Down Expand Up @@ -610,7 +611,13 @@ protected FromXmlParser _createParser(char[] data, int offset, int len, IOContex
// is always same as if 'false' was passed
XMLStreamReader sr;
try {
sr = _xmlInputFactory.createXMLStreamReader(new Stax2CharArraySource(data, offset, len));
// 03-Jul-2021, tatu: [dataformat-xml#482] non-Stax2 impls unlikely to
// support so avoid:
if (_xmlInputFactory instanceof XMLInputFactory2) {
sr = _xmlInputFactory.createXMLStreamReader(new Stax2CharArraySource(data, offset, len));
} else {
sr = _xmlInputFactory.createXMLStreamReader(new CharArrayReader(data, offset, len));
}
} catch (XMLStreamException e) {
return StaxUtil.throwAsParseException(e, null);
}
Expand All @@ -628,7 +635,13 @@ protected FromXmlParser _createParser(byte[] data, int offset, int len, IOContex
{
XMLStreamReader sr;
try {
sr = _xmlInputFactory.createXMLStreamReader(new Stax2ByteArraySource(data, offset, len));
// 03-Jul-2021, tatu: [dataformat-xml#482] non-Stax2 impls unlikely to
// support so avoid:
if (_xmlInputFactory instanceof XMLInputFactory2) {
sr = _xmlInputFactory.createXMLStreamReader(new Stax2ByteArraySource(data, offset, len));
} else {
sr = _xmlInputFactory.createXMLStreamReader(new ByteArrayInputStream(data, offset, len));
}
} catch (XMLStreamException e) {
return StaxUtil.throwAsParseException(e, null);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.fasterxml.jackson.dataformat.xml.interop;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.ObjectReader;
import com.fasterxml.jackson.dataformat.xml.XmlFactory;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.XmlTestBase;
import com.sun.xml.stream.ZephyrParserFactory;
import com.sun.xml.stream.ZephyrWriterFactory;

// to verify issue behind [dataformat-xml#482]
public class NonWoodstoxStaxImpl482Test extends XmlTestBase
{
static class Root {
public int value = 3;
}

private final XmlMapper SJSXP_MAPPER = XmlMapper.builder(
XmlFactory.builder()
.inputFactory(new ZephyrParserFactory())
.outputFactory(new ZephyrWriterFactory())
.build())
.build();

// [dataformat-xml#482]
public void testSjsxpFromByteArray() throws Exception
{
byte[] xml0 = SJSXP_MAPPER.writeValueAsBytes(new Root());
// and just for fun, ensure offset handling works:
byte[] xml = new byte[xml0.length + 10];
System.arraycopy(xml0, 0, xml, 5, xml0.length);
Root result = SJSXP_MAPPER.readValue(xml, 5, xml0.length, Root.class);
assertNotNull(result);
}

// [dataformat-xml#482]
public void testSjsxpFromCharArray() throws Exception
{
char[] xml0 = SJSXP_MAPPER.writeValueAsString(new Root()).toCharArray();
// add offset
char[] xml = new char[xml0.length + 10];
System.arraycopy(xml0, 0, xml, 5, xml0.length);
ObjectReader r = SJSXP_MAPPER.readerFor(Root.class);
JsonParser p = r.createParser(xml, 5, xml0.length);
Root result = r.readValue(p);
p.close();
assertNotNull(result);
}
}

0 comments on commit 5b32f81

Please sign in to comment.