package com.fasterxml.jackson.dataformat.xml.ser; import java.util.*; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.fasterxml.jackson.dataformat.xml.XmlTestBase; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; public class TestIndentation extends XmlTestBase { static class StringWrapperBean { public StringWrapper string; public StringWrapperBean() { } public StringWrapperBean(String s) { string = new StringWrapper(s); } } static class IntWrapperBean { public IntWrapper wrapped; public IntWrapperBean() { } public IntWrapperBean(int i) { wrapped = new IntWrapper(i); } } // [dataformat-xml#45] static class AttrBean { @JacksonXmlProperty(isAttribute=true) public int count = 3; } static class AttrBean2 { @JacksonXmlProperty(isAttribute=true) public int count = 3; public int value = 14; } public class PojoFor123 { @JacksonXmlProperty(isAttribute = true) public String name; @JsonInclude(JsonInclude.Include.NON_EMPTY) public String property; public PojoFor123(String name) { this.name = name; } } // for [dataformat-xml#172] static class Company { @JacksonXmlElementWrapper(localName="e") public List<Employee> employee = new ArrayList<Employee>(); } static class Employee { public String id; public EmployeeType type; public Employee(String id) { this.id = id; type = EmployeeType.FULL_TIME; } } static enum EmployeeType { FULL_TIME; } /* /********************************************************** /* 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(); _xmlMapper.configure(SerializationFeature.INDENT_OUTPUT, true); } /* /********************************************************** /* Unit tests /********************************************************** */ // Verify [dataformat-xml#1] public void testSimpleStringBean() throws Exception { StringWrapperBean input = new StringWrapperBean("abc"); String xml = _xmlMapper.writeValueAsString(input); // should have at least one linefeed, space... if (xml.indexOf('\n') < 0 || xml.indexOf(' ') < 0) { fail("No indentation: XML == "+xml); } // Let's verify we get similar stuff back, first: StringWrapperBean result = _xmlMapper.readValue(xml, StringWrapperBean.class); assertNotNull(result); assertEquals("abc", result.string.str); // Try via ObjectWriter as well xml = _xmlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(input); if (xml.indexOf('\n') < 0 || xml.indexOf(' ') < 0) { fail("No indentation: XML == "+xml); } result = _xmlMapper.readValue(xml, StringWrapperBean.class); assertNotNull(result); assertEquals("abc", result.string.str); } public void testSimpleIntBean() throws Exception { String xml = _xmlMapper.writeValueAsString(new IntWrapperBean(42)); // should have at least one linefeed, space... if (xml.indexOf('\n') < 0 || xml.indexOf(' ') < 0) { fail("No indentation: XML == "+xml); } // Let's verify we get similar stuff back, first: IntWrapperBean result = _xmlMapper.readValue(xml, IntWrapperBean.class); assertNotNull(result); assertEquals(42, result.wrapped.i); } public void testSimpleMap() throws Exception { Map<String,String> map = new HashMap<String,String>(); map.put("a", "b"); String xml = _xmlMapper.writeValueAsString(map); // should have at least one linefeed, space... if (xml.indexOf('\n') < 0 || xml.indexOf(' ') < 0) { fail("No indentation: XML == "+xml); } // Let's verify we get similar stuff back, first: Map<?,?> result = _xmlMapper.readValue(xml, Map.class); assertNotNull(result); assertEquals(1, result.size()); assertEquals("b", map.get("a")); } // [dataformat-xml#45]: Use of attributes should not force linefeed for empty elements public void testWithAttr() throws Exception { String xml = _xmlMapper.writeValueAsString(new AttrBean()); assertEquals("<AttrBean count=\"3\"/>\n", xml); String xml2 = _xmlMapper.writeValueAsString(new AttrBean2()); assertEquals("<AttrBean2 count=\"3\">\n <value>14</value>\n</AttrBean2>\n", xml2); } public void testEmptyElem() throws Exception { PojoFor123 simple = new PojoFor123("foobar"); String xml = _xmlMapper.writeValueAsString(simple); assertEquals("<PojoFor123 name=\"foobar\"/>\n", xml); } public void testMultiLevel172() throws Exception { Company root = new Company(); root.employee.add(new Employee("abc")); String xml = _xmlMapper.writer() .with(ToXmlGenerator.Feature.WRITE_XML_DECLARATION) .writeValueAsString(root); // unify possible apostrophes to quotes xml = aposToQuotes(xml); // with indentation, should get linefeeds in prolog/epilog too assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +"<Company>\n" +" <e>\n" +" <employee>\n" +" <id>abc</id>\n" +" <type>FULL_TIME</type>\n" +" </employee>\n" +" </e>\n" +"</Company>\n", xml); } }