From 0bf40173692e5fc566f4e1307952c289bf788d17 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sat, 2 Jan 2016 21:35:29 -0800 Subject: [PATCH] add a failing test for #170 --- .../jackson/dataformat/xml/XmlMapper.java | 9 +- .../failing/DeserializePolyList178Test.java | 80 +++++++++++ .../xml/failing/JAXBObjectId170Test.java | 125 ++++++++++++++++++ .../xml/lists/ListDeserializationTest.java | 2 +- 4 files changed, 213 insertions(+), 3 deletions(-) create mode 100644 src/test/java/com/fasterxml/jackson/dataformat/xml/failing/DeserializePolyList178Test.java create mode 100644 src/test/java/com/fasterxml/jackson/dataformat/xml/failing/JAXBObjectId170Test.java 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 226befb17..d81ddda17 100644 --- a/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java +++ b/src/main/java/com/fasterxml/jackson/dataformat/xml/XmlMapper.java @@ -49,12 +49,16 @@ public XmlMapper() { this(new XmlFactory()); } - /** @since 2.4 */ + /** + * @since 2.4 + */ public XmlMapper(XMLInputFactory inputF, XMLOutputFactory outF) { this(new XmlFactory(inputF, outF)); } - /** @since 2.4 */ + /** + * @since 2.4 + */ public XmlMapper(XMLInputFactory inputF) { this(new XmlFactory(inputF)); } @@ -111,6 +115,7 @@ public Version version() { protected void setXMLTextElementName(String name) { ((XmlFactory) _jsonFactory).setXMLTextElementName(name); } + /** * Since 2.7 */ diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/failing/DeserializePolyList178Test.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/failing/DeserializePolyList178Test.java new file mode 100644 index 000000000..b45806160 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/failing/DeserializePolyList178Test.java @@ -0,0 +1,80 @@ +package com.fasterxml.jackson.dataformat.xml.failing; + +import java.util.ArrayList; +import java.util.List; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import com.fasterxml.jackson.dataformat.xml.XmlTestBase; + +public class DeserializePolyList178Test extends XmlTestBase +{ + static class Company { + public List computers; + + public Company() { + computers = new ArrayList(); + } + + public Company add(Computer computer) { + if (computers == null) { + computers = new ArrayList(); + } + computers.add(computer); + return this; + } + } + +// 02-Jan-2015, tatu: Does not seem to matter; was included in the original reproduction +// @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.WRAPPER_OBJECT, + property = "type") + @JsonSubTypes({ + @JsonSubTypes.Type(value = DesktopComputer.class, name = "desktop"), + @JsonSubTypes.Type(value = LaptopComputer.class, name = "laptop") + }) + static class Computer { + public String id; + } + + @JsonTypeName("desktop") + static class DesktopComputer extends Computer { + public String location; + + protected DesktopComputer() { } + public DesktopComputer with(String id0, String l) { + id = id0; + location = l; + return this; + } + } + + @JsonTypeName("laptop") + static class LaptopComputer extends Computer { + public String vendor; + } + + /* + /********************************************************** + /* Unit tests + /********************************************************** + */ + + private final XmlMapper MAPPER = new XmlMapper(); + + // for [dataformat-xml#178] + public void testPolyIdList178() throws Exception + { + Company input = new Company(); + input.add(new DesktopComputer().with("1", "http://foo.com")); + input.add(new DesktopComputer().with("2", "http://bar.com")); + String xml = MAPPER.writerWithDefaultPrettyPrinter() + .writeValueAsString(input); +//System.out.println("XML:\n"+xml); + + Company result = MAPPER.readValue(xml, Company.class); + assertNotNull(result.computers); + assertEquals(2, result.computers.size()); + } +} diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/failing/JAXBObjectId170Test.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/failing/JAXBObjectId170Test.java new file mode 100644 index 000000000..e59ff9650 --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/failing/JAXBObjectId170Test.java @@ -0,0 +1,125 @@ +package com.fasterxml.jackson.dataformat.xml.failing; + +import java.util.ArrayList; +import java.util.List; + +import javax.xml.bind.annotation.*; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.AnnotationIntrospector; +import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; +import com.fasterxml.jackson.dataformat.xml.XmlAnnotationIntrospector; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import com.fasterxml.jackson.dataformat.xml.XmlTestBase; +import com.fasterxml.jackson.dataformat.xml.jaxb.XmlJaxbAnnotationIntrospector; + +public class JAXBObjectId170Test extends XmlTestBase +{ + static class Company { + public List computers; + public List employees; + + public Company() { + computers = new ArrayList(); + } + + public Company add(Computer computer) { + if (computers == null) { + computers = new ArrayList(); + } + computers.add(computer); + return this; + } + } + + @XmlType(name = "employee") + @XmlAccessorType(XmlAccessType.FIELD) + static class Employee { + @XmlAttribute + @XmlID + public String id; + + @XmlAttribute + public String name; + + @XmlIDREF + public Computer computer; + } + + @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.WRAPPER_OBJECT, + property = "type") + @JsonSubTypes({ + @JsonSubTypes.Type(value = DesktopComputer.class, name = "desktop"), + @JsonSubTypes.Type(value = LaptopComputer.class, name = "laptop") + }) + static class Computer { + public String id; + } + + static class DesktopComputer extends Computer { + public String location; + + protected DesktopComputer() { } + public DesktopComputer with(String id0, String l) { + id = id0; + location = l; + return this; + } + } + + static class LaptopComputer extends Computer { + public String vendor; + } + + /* + /********************************************************** + /* Unit tests + /********************************************************** + */ + + // for [dataformat-xml#178] + public void testPolyIdList178() throws Exception + { + final String XML = +"\n"+ +"\n"+ +" \n"+ +" \n"+ +" Bangkok\n"+ +" \n"+ +" \n"+ +" \n"+ +" \n"+ +" Pattaya\n"+ +" \n"+ +" \n"+ +" \n"+ +" \n"+ +" Apple\n"+ +" \n"+ +" \n"+ +" \n"+ +" \n"+ +" \n"+ +" computer-3\n"+ +" \n"+ +" \n"+ +" computer-2\n"+ +" \n"+ +" \n"+ +"\n" + ; + + XmlMapper mapper = new XmlMapper(); + AnnotationIntrospector intr = XmlAnnotationIntrospector.Pair.instance + (new XmlJaxbAnnotationIntrospector(mapper.getTypeFactory()), new JacksonAnnotationIntrospector()); + mapper.setAnnotationIntrospector(intr); + // should be default but doesn't seem to be? + mapper.setDefaultUseWrapper(true); + + Company result = mapper.readValue(XML, Company.class); + assertNotNull(result); + } +} diff --git a/src/test/java/com/fasterxml/jackson/dataformat/xml/lists/ListDeserializationTest.java b/src/test/java/com/fasterxml/jackson/dataformat/xml/lists/ListDeserializationTest.java index b459ad92f..0f511ef5c 100644 --- a/src/test/java/com/fasterxml/jackson/dataformat/xml/lists/ListDeserializationTest.java +++ b/src/test/java/com/fasterxml/jackson/dataformat/xml/lists/ListDeserializationTest.java @@ -127,7 +127,7 @@ public void testWrappedListBeanDeser() throws Exception assertEquals(Integer.valueOf(3), bean.values.get(2)); } - // for [Issue#33] + // for [dataformat-xml#33] public void testWrappedListWithAttribute() throws Exception { ListBeanWrapped bean = MAPPER.readValue(