package org.openstack.atlas.api.helpers.JsonSerializer; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonProcessingException; import org.codehaus.jackson.map.JsonSerializer; import org.codehaus.jackson.map.SerializationConfig; import org.codehaus.jackson.map.SerializerProvider; import org.codehaus.jackson.map.introspect.BasicBeanDescription; import org.codehaus.jackson.map.ser.CustomSerializerFactory; import org.codehaus.jackson.map.type.TypeFactory; import org.codehaus.jackson.type.JavaType; import org.openstack.atlas.api.helpers.reflection.ClassReflectionTools; import java.io.IOException; import java.util.GregorianCalendar; public class ObjectWrapperSerializer extends JsonSerializer<Object> { private final SerializationConfig config; private final String wrapperFieldName; public ObjectWrapperSerializer(SerializationConfig config, Class someClass) { String rootName; this.config = config; if (someClass == null) { this.wrapperFieldName = null; return; } rootName = ClassReflectionTools.getXmlRootElementName(someClass); if (rootName == null) { this.wrapperFieldName = someClass.getSimpleName(); return; } this.wrapperFieldName = rootName; } @Override public void serialize(Object object, JsonGenerator jgen, SerializerProvider sp) throws IOException { //BeanSerializerFactory bsf = BeanSerializerFactory.instance; CustomSerializerFactory csf = new CustomSerializerFactory(); csf.addSpecificMapping(GregorianCalendar.class, new DateTimeSerializer(config, null)); JavaType type = TypeFactory.type(object.getClass()); BasicBeanDescription beanDesc = config.introspect(type); JsonSerializer<Object> serializer = csf.findBeanSerializer(type, config, beanDesc); if (wrapperFieldName != null) { jgen.writeStartObject(); jgen.writeFieldName(wrapperFieldName); } SerializerProviderBuilder provider = new SerializerProviderBuilder(); serializer.serialize(object, jgen, provider.createProvider(config, csf)); if (wrapperFieldName != null) { jgen.writeEndObject(); } } }