Stax2JacksonReaderAdapter.java
package com.fasterxml.jackson.dataformat.xml.util;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import org.codehaus.stax2.XMLStreamReader2;
import org.codehaus.stax2.ri.Stax2ReaderAdapter;
import com.fasterxml.jackson.databind.util.ClassUtil;
/**
* Refinement of {@link Stax2ReaderAdapter} to override certain methods,
* to patch over flaws of JDK-provided default Stax implementation, SJSXP
*
* @since 2.17
*/
public class Stax2JacksonReaderAdapter
extends Stax2ReaderAdapter
{
private final XMLStreamReader _delegate;
public Stax2JacksonReaderAdapter(XMLStreamReader sr) {
super(sr);
_delegate = sr;
}
public static XMLStreamReader2 wrapIfNecessary(XMLStreamReader sr)
{
if (sr instanceof XMLStreamReader2) {
return (XMLStreamReader2) sr;
}
return new Stax2JacksonReaderAdapter(sr);
}
// 04-Dec-2023, tatu: Needed to catch exceptions from buggy SJSXP decoder...
@Override
public int next() throws XMLStreamException
{
try {
return super.next();
} catch (ArrayIndexOutOfBoundsException e) {
// Use IllegalStateException since that is guaranteed to be translated
// appropriately into Jackson type by caller:
throw new IllegalStateException(
"Internal processing error by `XMLStreamReader` of type "
+ClassUtil.classNameOf(_delegate)+" when calling `next()` ("
+"consider using Woodstox instead): "
+e.getMessage(), e);
}
}
}