blob: d67f4d8adef2547185ae86e7b4742588b7f62bb0 [file] [log] [blame]
package org.codehaus.jackson.jaxb;
import java.util.*;
import javax.xml.bind.annotation.*;
import org.codehaus.jackson.annotate.*;
import org.codehaus.jackson.map.*;
/**
* Tests for handling of type-related JAXB annotations
*/
public class TestJaxbTypes
extends BaseJaxbTest
{
/*
/**********************************************************
/* Helper beans
/**********************************************************
*/
static class AbstractWrapper {
@XmlElement(type=BeanImpl.class)
public AbstractBean wrapped;
public AbstractWrapper() { this(null); }
public AbstractWrapper(AbstractBean bean) { wrapped = bean; }
}
interface AbstractBean { }
static class BeanImpl
implements AbstractBean
{
public int a;
protected String b;
public BeanImpl() { this(0, null); }
public BeanImpl(int a, String b) {
this.a = a;
this.b = b;
}
public String getB() { return b; }
public void setB(String b) { this.b = b; }
}
static class ListBean {
/* Note: here we rely on implicit linking between the field
* and accessors.
*/
@XmlElement(type=BeanImpl.class)
private List<AbstractBean> beans;
public ListBean() { }
public ListBean(AbstractBean ... beans) {
this.beans = Arrays.asList(beans);
}
public ListBean(List<AbstractBean> beans) {
this.beans = beans;
}
public List<AbstractBean> getBeans() { return beans; }
public void setBeans(List<AbstractBean> b) { beans = b; }
public int size() { return beans.size(); }
public BeanImpl get(int index) { return (BeanImpl) beans.get(index); }
}
/* And then mix'n match, to try end-to-end
*/
static class ComboBean
{
private AbstractBean bean;
public ListBean beans;
public ComboBean() { }
public ComboBean(AbstractBean bean, ListBean beans)
{
this.bean = bean;
this.beans = beans;
}
@XmlElement(type=BeanImpl.class)
public AbstractBean getBean() { return bean; }
public void setBean(AbstractBean bean) { this.bean = bean; }
}
/**
* Unit test for [JACKSON-250]
*/
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include= JsonTypeInfo.As.PROPERTY)
@JsonTypeName("Name")
@XmlType
static class P2
{
String id;
public P2(String id) { this.id = id; }
public P2() { }
@XmlID
@XmlAttribute(name="id")
public String getId() { return id; }
public void setId(String id) { this.id = id; }
}
/*
/**********************************************************
/* Unit tests
/**********************************************************
*/
public void testXmlElementTypeDeser() throws Exception
{
ObjectMapper mapper = getJaxbMapper();
AbstractWrapper wrapper = mapper.readValue("{\"wrapped\":{\"a\":13,\"b\":\"...\"}}", AbstractWrapper.class);
assertNotNull(wrapper);
BeanImpl bean = (BeanImpl) wrapper.wrapped;
assertEquals(13, bean.a);
assertEquals("...", bean.b);
}
public void testXmlElementTypeSer() throws Exception
{
ObjectMapper mapper = getJaxbMapper();
AbstractWrapper wrapper = new AbstractWrapper(new BeanImpl(-3, "c"));
assertEquals("{\"wrapped\":{\"a\":-3,\"b\":\"c\"}}",
mapper.writeValueAsString(wrapper));
}
public void testXmlElementListTypeDeser() throws Exception
{
ObjectMapper mapper = getJaxbMapper();
ListBean listBean = mapper.readValue
("{\"beans\": [{\"a\":1,\"b\":\"a\"}, {\"a\":7,\"b\":\"b\" }]}",
ListBean.class);
assertNotNull(listBean);
List<AbstractBean> beans = listBean.beans;
assertNotNull(beans);
assertEquals(2, beans.size());
assertNotNull(beans.get(0));
assertNotNull(beans.get(1));
BeanImpl bean = (BeanImpl) beans.get(0);
assertEquals(1, bean.a);
assertEquals("a", bean.b);
bean = (BeanImpl) beans.get(1);
assertEquals(7, bean.a);
assertEquals("b", bean.b);
}
public void testXmlElementListArrayDeser() throws Exception
{
ObjectMapper mapper = getJaxbMapper();
ListBean[] listBeans = mapper.readValue
("[{\"beans\": [{\"a\":1,\"b\":\"a\"}, {\"a\":7,\"b\":\"b\" }]}]",
ListBean[].class);
assertNotNull(listBeans);
assertEquals(1, listBeans.length);
List<AbstractBean> beans = listBeans[0].beans;
assertNotNull(beans);
assertEquals(2, beans.size());
BeanImpl bean = (BeanImpl) beans.get(0);
assertEquals(1, bean.a);
assertEquals("a", bean.b);
bean = (BeanImpl) beans.get(1);
assertEquals(7, bean.a);
assertEquals("b", bean.b);
}
public void testXmlElementListTypeSer() throws Exception
{
ObjectMapper mapper = getJaxbMapper();
ListBean bean = new ListBean();
List<AbstractBean> beans = new ArrayList<AbstractBean>();
beans.add(new BeanImpl(1, "a"));
beans.add(new BeanImpl(2, "b"));
bean.beans = beans;
assertEquals("{\"beans\":[{\"a\":1,\"b\":\"a\"},{\"a\":2,\"b\":\"b\"}]}",
mapper.writeValueAsString(bean));
}
public void testRoundTrip() throws Exception
{
ComboBean input = new ComboBean(new BeanImpl(3, "abc"),
new ListBean(new BeanImpl(1, "a"),
new BeanImpl(2, "b"),
new BeanImpl(3, "c")));
ObjectMapper mapper = getJaxbMapper();
String str = mapper.writeValueAsString(input);
ComboBean result = mapper.readValue(str, ComboBean.class);
assertEquals(3, ((BeanImpl)result.bean).a);
assertEquals("abc", ((BeanImpl)result.bean).b);
assertEquals(3, result.beans.size());
assertEquals(1, (result.beans.get(0)).a);
assertEquals("a", (result.beans.get(0)).b);
assertEquals(2, (result.beans.get(1)).a);
assertEquals("b", (result.beans.get(1)).b);
assertEquals(3, (result.beans.get(2)).a);
assertEquals("c", (result.beans.get(2)).b);
}
public void testListWithDefaultTyping() throws Exception
{
Object input = new ListBean(new BeanImpl(1, "a"));
ObjectMapper mapper = getJaxbMapper();
mapper.enableDefaultTyping();
String str = mapper.writeValueAsString(input);
ListBean listBean = mapper.readValue(str, ListBean.class);
assertNotNull(listBean);
List<AbstractBean> beans = listBean.beans;
assertNotNull(beans);
assertEquals(1, beans.size());
assertNotNull(beans.get(0));
BeanImpl bean = (BeanImpl) beans.get(0);
assertEquals(1, bean.a);
assertEquals("a", bean.b);
}
public void testIssue250() throws Exception
{
ObjectMapper mapper = getJaxbAndJacksonMapper();
P2 bean = new P2("myId");
String str = mapper.writeValueAsString(bean);
assertEquals("{\"@type\":\"Name\",\"id\":\"myId\"}", str);
}
}