package com.fasterxml.jackson.dataformat.xml.ser; import java.io.*; import java.util.*; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer; import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.XmlTestBase; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlCData; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; @SuppressWarnings("serial") public class TestSerialization extends XmlTestBase { static class StringBean2 { public String text = "foobar"; } static class AttributeBean { @JacksonXmlProperty(isAttribute=true, localName="attr") public String text = "something"; } static class AttrAndElem { public String elem = "whatever"; @JacksonXmlProperty(isAttribute=true, localName="id") public int attr = 42; } static class WrapperBean<T> { public T value; public WrapperBean() { } public WrapperBean(T v) { value = v; } } static class MapBean { public Map<String,Integer> map; public MapBean() { } public MapBean(Map<String,Integer> v) { map = v; } } static class NsElemBean { @JacksonXmlProperty(namespace="http://foo") public String text = "blah"; } static class CDataStringBean { @JacksonXmlCData public String value = "<some<data\""; } static class CDataStringArrayBean { @JacksonXmlCData public String[] value = {"<some<data\"", "abc"}; } static class CustomSerializer extends StdScalarSerializer<String> { public CustomSerializer() { super(String.class); } @Override public void serialize(String value, JsonGenerator jgen, SerializerProvider provider) throws IOException { jgen.writeString("custom:"+value); } } static class CustomMap extends LinkedHashMap<String, Integer> { } /* /********************************************************** /* Unit tests /********************************************************** */ protected XmlMapper _xmlMapper = new XmlMapper(); public void testSimpleAttribute() throws IOException { String xml = _xmlMapper.writeValueAsString(new AttributeBean()); xml = removeSjsxpNamespace(xml); assertEquals("<AttributeBean attr=\"something\"/>", xml); } public void testSimpleNsElem() throws IOException { String xml = _xmlMapper.writeValueAsString(new NsElemBean()); xml = removeSjsxpNamespace(xml); // here we assume woodstox automatic prefixes, not very robust but: assertEquals("<NsElemBean><wstxns1:text xmlns:wstxns1=\"http://foo\">blah</wstxns1:text></NsElemBean>", xml); } public void testSimpleAttrAndElem() throws IOException { String xml = _xmlMapper.writeValueAsString(new AttrAndElem()); xml = removeSjsxpNamespace(xml); assertEquals("<AttrAndElem id=\"42\"><elem>whatever</elem></AttrAndElem>", xml); } @SuppressWarnings("boxing") public void testMap() throws IOException { // First, map in a general wrapper LinkedHashMap<String,Integer> map = new LinkedHashMap<String,Integer>(); map.put("a", 1); map.put("b", 2); String xml; xml = _xmlMapper.writeValueAsString(new WrapperBean<Map<?,?>>(map)); assertEquals("<WrapperBean><value>" +"<a>1</a>" +"<b>2</b>" +"</value></WrapperBean>", xml); // then as strongly typed xml = _xmlMapper.writeValueAsString(new MapBean(map)); assertEquals("<MapBean><map>" +"<a>1</a>" +"<b>2</b>" +"</map></MapBean>", xml); } public void testNakedMap() throws IOException { CustomMap input = new CustomMap(); input.put("a", 123); input.put("b", 456); String xml = _xmlMapper.writeValueAsString(input); // System.err.println("XML = "+xml); CustomMap result = _xmlMapper.readValue(xml, CustomMap.class); assertEquals(2, result.size()); assertEquals(Integer.valueOf(456), result.get("b")); } public void testCDataString() throws IOException { String xml = _xmlMapper.writeValueAsString(new CDataStringBean()); xml = removeSjsxpNamespace(xml); assertEquals("<CDataStringBean><value><![CDATA[<some<data\"]]></value></CDataStringBean>", xml); } public void testCDataStringArray() throws IOException { String xml = _xmlMapper.writeValueAsString(new CDataStringArrayBean()); xml = removeSjsxpNamespace(xml); assertEquals("<CDataStringArrayBean><value><value><![CDATA[<some<data\"]]></value><value><![CDATA[abc]]></value></value></CDataStringArrayBean>", xml); } // for [dataformat-xml#41] public void testCustomSerializer() throws Exception { JacksonXmlModule module = new JacksonXmlModule(); module.addSerializer(String.class, new CustomSerializer()); XmlMapper xml = new XmlMapper(module); assertEquals("<String>custom:foo</String>", xml.writeValueAsString("foo")); } // manual 'test' to see "what would JAXB do?" /* public void testJAXB() throws Exception { StringWriter sw = new StringWriter(); javax.xml.bind.JAXB.marshal(new StringListBean("a", "b", "c"), sw); System.out.println("JAXB -> "+sw); } */ }