package com.fasterxml.jackson.dataformat.xml.ser; import java.io.IOException; import java.util.*; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.XmlTestBase; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; public class TestSerializationAttr extends XmlTestBase { static class NsAttrBean { @JacksonXmlProperty(namespace="http://foo", isAttribute=true) public String attr = "3"; } @JacksonXmlRootElement(localName="test", namespace="http://root") static class Issue19Bean { @JsonProperty @JacksonXmlProperty(namespace = "http://my.ns") public boolean booleanA = true; @JsonProperty @JacksonXmlProperty(isAttribute=true) public String id = "abc"; } public class Jurisdiction { @JacksonXmlProperty(isAttribute=true) protected String name = "Foo"; @JacksonXmlProperty(isAttribute=true) protected int value = 13; } @JacksonXmlRootElement(localName = "dynaBean", namespace = "") @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "class", include = JsonTypeInfo.As.PROPERTY) public class DynaBean { private final Map<String, String> _properties = new TreeMap<String, String>(); public DynaBean(Map<String, String> values) { _properties.putAll(values); } @JsonAnyGetter @JacksonXmlProperty(isAttribute = false) public Map<String, String> getProperties() { return _properties; } } /* /********************************************************** /* Set up /********************************************************** */ protected XmlMapper _xmlMapper; // let's actually reuse XmlMapper to make things bit faster @Override public void setUp() throws Exception { super.setUp(); _xmlMapper = new XmlMapper(); } /* /********************************************************** /* Unit tests /********************************************************** */ public void testSimpleNsAttr() throws IOException { String xml = _xmlMapper.writeValueAsString(new NsAttrBean()); xml = removeSjsxpNamespace(xml); // here we assume woodstox automatic prefixes, not very robust but: assertEquals("<NsAttrBean xmlns:wstxns1=\"http://foo\" wstxns1:attr=\"3\"/>", xml); } public void testIssue19() throws IOException { String xml = _xmlMapper.writeValueAsString(new Issue19Bean()); xml = removeSjsxpNamespace(xml); xml = xml.replaceAll("\"", "'"); // as with above, assumes exact NS allocation strategy, not optimal: assertEquals("<test xmlns='http://root' id='abc'>" +"<wstxns1:booleanA xmlns:wstxns1='http://my.ns'>true</wstxns1:booleanA></test>", xml); } public void testIssue6() throws IOException { assertEquals("<Jurisdiction name=\"Foo\" value=\"13\"/>", _xmlMapper.writeValueAsString(new Jurisdiction())); } public void testIssue117AnySetterAttrs() throws IOException { Map<String, String> values = new HashMap<String, String>(); values.put("prop1", "val1"); String xml = _xmlMapper.writeValueAsString(new DynaBean(values)); assertEquals("<dynaBean class=\"TestSerializationAttr$DynaBean\"><prop1>val1</prop1></dynaBean>", removeSjsxpNamespace(xml)); } /* /********************************************************** /* Helper methods /********************************************************** */ // 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); } */ }