From 38e7afea5efe2ca6ec71c470ad1cd2b9707c5f43 Mon Sep 17 00:00:00 2001 From: Gene Trog Date: Tue, 16 May 2017 16:05:05 -0400 Subject: [PATCH 1/2] Issue#233 XmlMapper.copy() doesn't properly copy internal configurations --- .../jackson/dataformat/xml/XmlMapper.java | 27 ++++++++++++------- .../xml/ser/XmlSerializerProvider.java | 18 ++++++++----- .../dataformat/xml/VersionInfoTest.java | 25 ++++++++++++----- 3 files changed, 47 insertions(+), 23 deletions(-) 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 a06f16348..a69b6c407 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java @@ -1,21 +1,23 @@ package com.fasterxml.jackson.dataformat.xml; -import java.io.IOException; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.XMLStreamWriter; - -import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.PrettyPrinter; +import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.AnnotationIntrospector; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser; import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator; import com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider; import com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter; import com.fasterxml.jackson.dataformat.xml.util.XmlRootNameLookup; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; +import java.io.IOException; + /** * Customized {@link ObjectMapper} that will read and write XML instead of JSON, * using XML-backed {@link com.fasterxml.jackson.core.JsonFactory} @@ -86,11 +88,16 @@ public XmlMapper(XmlFactory xmlFactory, JacksonXmlModule module) _serializationConfig = _serializationConfig.withDefaultPrettyPrinter(DEFAULT_XML_PRETTY_PRINTER); } + protected XmlMapper(XmlMapper mapper) { + super(mapper); + this._xmlModule = mapper._xmlModule; + } + @Override public XmlMapper copy() { _checkInvalidCopy(XmlMapper.class); - return new XmlMapper((XmlFactory) _jsonFactory.copy(), _xmlModule); + return new XmlMapper(this); } @Override diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/XmlSerializerProvider.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/XmlSerializerProvider.java index 56ab51574..fc15473a8 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/XmlSerializerProvider.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/XmlSerializerProvider.java @@ -1,23 +1,22 @@ package com.fasterxml.jackson.dataformat.xml.ser; -import java.io.IOException; - -import javax.xml.namespace.QName; -import javax.xml.stream.XMLStreamException; - -import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.PropertyName; import com.fasterxml.jackson.databind.SerializationConfig; -import com.fasterxml.jackson.databind.ser.SerializerFactory; import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider; +import com.fasterxml.jackson.databind.ser.SerializerFactory; import com.fasterxml.jackson.databind.util.TokenBuffer; import com.fasterxml.jackson.dataformat.xml.util.StaxUtil; import com.fasterxml.jackson.dataformat.xml.util.TypeUtil; import com.fasterxml.jackson.dataformat.xml.util.XmlRootNameLookup; +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import java.io.IOException; + /** * We need to override some parts of * {@link com.fasterxml.jackson.databind.SerializerProvider} @@ -55,6 +54,11 @@ public XmlSerializerProvider(XmlSerializerProvider src, /********************************************************************** */ + @Override + public DefaultSerializerProvider copy() { + return this; + } + @Override public DefaultSerializerProvider createInstance(SerializationConfig config, SerializerFactory jsf) { diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/VersionInfoTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/VersionInfoTest.java index 83f2a0622..7b678205b 100644 --- a/src/test/java/com/fasterxml/jackson/dataformat/xml/VersionInfoTest.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/VersionInfoTest.java @@ -1,14 +1,16 @@ package com.fasterxml.jackson.dataformat.xml; -import java.io.*; - import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.core.Versioned; -import com.fasterxml.jackson.dataformat.xml.PackageVersion; -import com.fasterxml.jackson.dataformat.xml.XmlFactory; -import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import com.fasterxml.jackson.databind.SerializationConfig; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + public class VersionInfoTest extends XmlTestBase { public void testMapperVersions() @@ -24,7 +26,8 @@ public void testMapperCopy() XmlMapper mapper1 = new XmlMapper(); mapper1.setXMLTextElementName("foo"); mapper1.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true); - + mapper1.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); + XmlMapper mapper2 = mapper1.copy(); assertNotSame(mapper1, mapper2); XmlFactory xf1 = mapper1.getFactory(); @@ -36,6 +39,16 @@ public void testMapperCopy() assertEquals(xf1.getXMLTextElementName(), xf2.getXMLTextElementName()); assertEquals(xf1._xmlGeneratorFeatures, xf2._xmlGeneratorFeatures); assertEquals(xf1._xmlParserFeatures, xf2._xmlParserFeatures); + + // and [Issue#233] + SerializationConfig sc1 = mapper1.getSerializationConfig(); + SerializationConfig sc2 = mapper2.getSerializationConfig(); + assertNotSame(sc1, sc2); + assertEquals( + "serialization features did not get copied", + sc1.getSerializationFeatures(), + sc2.getSerializationFeatures() + ); } // Another test for [Issue#48] From 3cc587d2743109dc8268bebaa3a1da2d73b2397f Mon Sep 17 00:00:00 2001 From: Gene Trog Date: Wed, 17 May 2017 09:42:18 -0400 Subject: [PATCH 2/2] Making suggested changes --- .../jackson/dataformat/xml/XmlMapper.java | 20 +++++++++---------- .../xml/ser/XmlSerializerProvider.java | 20 ++++++++++++------- .../dataformat/xml/VersionInfoTest.java | 16 ++++++++++----- 3 files changed, 33 insertions(+), 23 deletions(-) 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 a69b6c407..380714ab7 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java @@ -1,23 +1,21 @@ package com.fasterxml.jackson.dataformat.xml; -import com.fasterxml.jackson.core.PrettyPrinter; -import com.fasterxml.jackson.core.Version; +import java.io.IOException; + +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLOutputFactory; +import javax.xml.stream.XMLStreamReader; +import javax.xml.stream.XMLStreamWriter; + +import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.AnnotationIntrospector; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.dataformat.xml.deser.FromXmlParser; import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator; import com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider; import com.fasterxml.jackson.dataformat.xml.util.DefaultXmlPrettyPrinter; import com.fasterxml.jackson.dataformat.xml.util.XmlRootNameLookup; -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.XMLStreamWriter; -import java.io.IOException; - /** * Customized {@link ObjectMapper} that will read and write XML instead of JSON, * using XML-backed {@link com.fasterxml.jackson.core.JsonFactory} diff --git a/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/XmlSerializerProvider.java b/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/XmlSerializerProvider.java index fc15473a8..179a331b4 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/XmlSerializerProvider.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/ser/XmlSerializerProvider.java @@ -1,22 +1,23 @@ package com.fasterxml.jackson.dataformat.xml.ser; -import com.fasterxml.jackson.core.JsonGenerator; +import java.io.IOException; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; + +import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.PropertyName; import com.fasterxml.jackson.databind.SerializationConfig; -import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider; import com.fasterxml.jackson.databind.ser.SerializerFactory; +import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider; import com.fasterxml.jackson.databind.util.TokenBuffer; import com.fasterxml.jackson.dataformat.xml.util.StaxUtil; import com.fasterxml.jackson.dataformat.xml.util.TypeUtil; import com.fasterxml.jackson.dataformat.xml.util.XmlRootNameLookup; -import javax.xml.namespace.QName; -import javax.xml.stream.XMLStreamException; -import java.io.IOException; - /** * We need to override some parts of * {@link com.fasterxml.jackson.databind.SerializerProvider} @@ -48,6 +49,11 @@ public XmlSerializerProvider(XmlSerializerProvider src, _rootNameLookup = src._rootNameLookup; } + protected XmlSerializerProvider(XmlSerializerProvider toCopy) { + super(toCopy); + this._rootNameLookup = toCopy._rootNameLookup; + } + /* /********************************************************************** /* Overridden methods @@ -56,7 +62,7 @@ public XmlSerializerProvider(XmlSerializerProvider src, @Override public DefaultSerializerProvider copy() { - return this; + return new XmlSerializerProvider(this); } @Override diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/VersionInfoTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/VersionInfoTest.java index 7b678205b..34a8bca9f 100644 --- a/src/test/java/com/fasterxml/jackson/dataformat/xml/VersionInfoTest.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/VersionInfoTest.java @@ -1,15 +1,15 @@ package com.fasterxml.jackson.dataformat.xml; +import java.io.*; + import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.core.Versioned; import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider; import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; +import com.fasterxml.jackson.dataformat.xml.ser.XmlSerializerProvider; +import com.fasterxml.jackson.dataformat.xml.util.XmlRootNameLookup; public class VersionInfoTest extends XmlTestBase { @@ -51,6 +51,12 @@ public void testMapperCopy() ); } + public void testSerializerProviderCopy() { + DefaultSerializerProvider provider = new XmlSerializerProvider(new XmlRootNameLookup()); + DefaultSerializerProvider copy = provider.copy(); + assertNotSame(provider, copy); + } + // Another test for [Issue#48] public void testMapperSerialization() throws Exception {