blob: 0bd61815aa47bc92a15b6df792d7094091a179b4 [file] [log] [blame]
package org.codehaus.jackson.map.ext;
import javax.xml.datatype.*;
import javax.xml.namespace.QName;
import org.codehaus.jackson.map.*;
import org.codehaus.jackson.map.ext.CoreXMLDeserializers;
/**
* Core XML types (javax.xml) are considered "external" (or more precisely "optional")
* since some Java(-like) platforms do not include them: specifically, Google AppEngine
* and Android seem to skimp on their inclusion. As such, they are dynamically loaded
* only as needed, and need bit special handling.
*
* @author tatu
*/
public class TestCoreXMLTypes
extends BaseMapTest
{
/*
/**********************************************************
/* Serializer tests
/**********************************************************
*/
public void testQNameSer() throws Exception
{
QName qn = new QName("http://abc", "tag", "prefix");
assertEquals(quote(qn.toString()), serializeAsString(qn));
}
public void testDurationSer() throws Exception
{
DatatypeFactory dtf = DatatypeFactory.newInstance();
// arbitrary value
Duration dur = dtf.newDurationDayTime(false, 15, 19, 58, 1);
assertEquals(quote(dur.toString()), serializeAsString(dur));
}
public void testXMLGregorianCalendarSerAndDeser() throws Exception
{
DatatypeFactory dtf = DatatypeFactory.newInstance();
XMLGregorianCalendar cal = dtf.newXMLGregorianCalendar
(1974, 10, 10, 18, 15, 17, 123, 0);
/* Due to [JACKSON-308], 1.6 will use configurable Date serialization;
* and it defaults to using timestamp. So let's try couple of combinations.
*/
ObjectMapper mapper = new ObjectMapper();
long timestamp = cal.toGregorianCalendar().getTimeInMillis();
String numStr = String.valueOf(timestamp);
assertEquals(numStr, mapper.writeValueAsString(cal));
// [JACKSON-403] Needs to come back ok as well:
XMLGregorianCalendar calOut = mapper.readValue(numStr, XMLGregorianCalendar.class);
assertNotNull(calOut);
assertEquals(timestamp, calOut.toGregorianCalendar().getTimeInMillis());
// and then textual variant
mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
// this is ALMOST same as default for XMLGregorianCalendar... just need to unify Z/+0000
String exp = cal.toXMLFormat();
String act = mapper.writeValueAsString(cal);
act = act.substring(1, act.length() - 1); // remove quotes
exp = removeZ(exp);
act = removeZ(act);
assertEquals(exp, act);
}
private String removeZ(String dateStr) {
if (dateStr.endsWith("Z")) {
return dateStr.substring(0, dateStr.length()-1);
}
if (dateStr.endsWith("+0000")) {
return dateStr.substring(0, dateStr.length()-5);
}
return dateStr;
}
/*
/**********************************************************
/* Deserializer tests
/**********************************************************
*/
// First things first: must be able to load the deserializers...
public void testDeserializerLoading()
{
new CoreXMLDeserializers.DurationDeserializer();
new CoreXMLDeserializers.GregorianCalendarDeserializer();
new CoreXMLDeserializers.QNameDeserializer();
}
public void testQNameDeser() throws Exception
{
QName qn = new QName("http://abc", "tag", "prefix");
String qstr = qn.toString();
ObjectMapper mapper = new ObjectMapper();
assertEquals("Should deserialize to equal QName (exp serialization: '"+qstr+"')",
qn, mapper.readValue(quote(qstr), QName.class));
}
public void testCalendarDeser() throws Exception
{
DatatypeFactory dtf = DatatypeFactory.newInstance();
XMLGregorianCalendar cal = dtf.newXMLGregorianCalendar
(1974, 10, 10, 18, 15, 17, 123, 0);
String exp = cal.toXMLFormat();
assertEquals("Should deserialize to equal XMLGregorianCalendar ('"+exp+"')", cal,
new ObjectMapper().readValue(quote(exp), XMLGregorianCalendar.class));
}
public void testDurationDeser() throws Exception
{
DatatypeFactory dtf = DatatypeFactory.newInstance();
// arbitrary value, like... say, 27d5h15m59s
Duration dur = dtf.newDurationDayTime(true, 27, 5, 15, 59);
String exp = dur.toString();
assertEquals("Should deserialize to equal Duration ('"+exp+"')", dur,
new ObjectMapper().readValue(quote(exp), Duration.class));
}
}