diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index e96af981d..3f4bf2a44 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -9,6 +9,8 @@ Project: jackson-dataformat-xml #618: `ArrayIndexOutOfBoundsException` thrown for invalid ending XML string when using JDK default Stax XML parser (reported by Arthur C) +#631: Add `XmlMapper.createGenerator(XMLStreamWriter)` and + `XmlMapper.createParser(XMLStreamReader)` overloads * Upgrade Woodstox to 6.6.0 (latest at the time) 2.16.1 (24-Dec-2023) diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java index 09d2c4d97..0fc5c1e91 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java @@ -268,7 +268,7 @@ protected TypeResolverBuilder _constructDefaultTypeResolverBuilder(DefaultTyp */ @Deprecated protected void setXMLTextElementName(String name) { - ((XmlFactory) _jsonFactory).setXMLTextElementName(name); + getFactory().setXMLTextElementName(name); } /** @@ -292,7 +292,7 @@ public XmlMapper setDefaultUseWrapper(boolean state) { * @since 2.14 */ public void setXmlNameProcessor(XmlNameProcessor processor) { - ((XmlFactory)_jsonFactory).setXmlNameProcessor(processor); + getFactory().setXmlNameProcessor(processor); } /* @@ -342,6 +342,26 @@ public ObjectMapper disable(FromXmlParser.Feature f) { /********************************************************** */ + /** + * Overloaded variant that allows constructing {@link FromXmlParser} + * for given Stax {@link XMLStreamReader}. + * + * @since 2.17 + */ + public FromXmlParser createParser(XMLStreamReader r) throws IOException { + return getFactory().createParser(r); + } + + /** + * Overloaded variant that allows constructing {@link ToXmlGenerator} + * for given Stax {@link XMLStreamWriter}. + * + * @since 2.17 + */ + public ToXmlGenerator createGenerator(XMLStreamWriter w) throws IOException { + return getFactory().createGenerator(w); + } + /** * Method for reading a single XML value from given XML-specific input * source; useful for incremental data-binding, combining traversal using @@ -374,7 +394,7 @@ public T readValue(XMLStreamReader r, TypeReference valueTypeRef) throws @SuppressWarnings("resource") public T readValue(XMLStreamReader r, JavaType valueType) throws IOException { - FromXmlParser p = getFactory().createParser(r); + FromXmlParser p = createParser(r); return super.readValue(p, valueType); } @@ -385,9 +405,9 @@ public T readValue(XMLStreamReader r, JavaType valueType) throws IOException * * @since 2.4 */ - public void writeValue(XMLStreamWriter w0, Object value) throws IOException { + public void writeValue(XMLStreamWriter w, Object value) throws IOException { @SuppressWarnings("resource") - ToXmlGenerator g = getFactory().createGenerator(w0); + ToXmlGenerator g = createGenerator(w); super.writeValue(g, value); // NOTE: above call should do flush(); and we should NOT close here. // Finally, 'g' has no buffers to release. diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/incr/IncrementalWritingTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/incr/IncrementalWritingTest.java index 509327fc0..94d561560 100644 --- a/src/test/java/com/fasterxml/jackson/dataformat/xml/incr/IncrementalWritingTest.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/incr/IncrementalWritingTest.java @@ -2,10 +2,12 @@ import java.io.*; +import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamWriter; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.XmlTestBase; +import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator; public class IncrementalWritingTest extends XmlTestBase { @@ -31,4 +33,29 @@ public void testSimple() throws Exception +"GrowlTiger", xml); } + + // @since 2.17 + public void testWriteUsingXMLStreamWriter() throws Exception + { + XMLOutputFactory staxF = MAPPER.getFactory().getXMLOutputFactory(); + final Point p = new Point(1, 2); + + // Serialize first using convenience method + try (StringWriter w = new StringWriter()) { + XMLStreamWriter sw = staxF.createXMLStreamWriter(w); + MAPPER.writeValue(sw, p); + assertEquals("12", w.toString()); + } + + // and then by explicit XMLStreamWriter + try (StringWriter w = new StringWriter()) { + XMLStreamWriter sw = staxF.createXMLStreamWriter(w); + sw.writeStartDocument("US-ASCII", "1.1"); + try (ToXmlGenerator g = MAPPER.createGenerator(sw)) { + MAPPER.writeValue(g, p); + assertEquals("" + +"12", w.toString()); + } + } + } } diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/incr/PartialReadTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/incr/PartialReadTest.java index e5a3173fe..1d787a2d3 100644 --- a/src/test/java/com/fasterxml/jackson/dataformat/xml/incr/PartialReadTest.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/incr/PartialReadTest.java @@ -3,6 +3,7 @@ import java.io.*; import javax.xml.stream.*; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.XmlTestBase; @@ -43,4 +44,27 @@ public void testSimpleRead() throws Exception sr.close(); } + + // @since 2.17 + public void testReadUsingXMLStreamReader() throws Exception + { + final String DOC = "12"; + + XMLInputFactory staxF = MAPPER.getFactory().getXMLInputFactory(); + + // First read using XmlMapper convenience method + XMLStreamReader sr = staxF.createXMLStreamReader(new StringReader(DOC)); + Point p = MAPPER.readValue(sr, Point.class); + assertEquals(1, p.x); + assertEquals(2, p.y); + sr.close(); + + // Then read using XmlFactory parser factory method + sr = staxF.createXMLStreamReader(new StringReader(DOC)); + try (JsonParser jp = MAPPER.createParser(sr)) { + p = MAPPER.readValue(jp, Point.class); + assertEquals(1, p.x); + assertEquals(2, p.y); + } + } }