package org.openstack.atlas.api.helpers;
import org.codehaus.jackson.map.DeserializationConfig;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.deser.CustomDeserializerFactory;
import org.codehaus.jackson.map.ser.CustomSerializerFactory;
import org.openstack.atlas.api.helpers.JsonDeserializer.DateTimeDeserializer;
import org.openstack.atlas.api.helpers.JsonDeserializer.DeserializerProviderBuilder;
import org.openstack.atlas.api.helpers.JsonDeserializer.ObjectWrapperDeserializer;
import org.openstack.atlas.api.helpers.JsonDeserializer.PropertyListDeserializer;
import org.openstack.atlas.api.helpers.JsonSerializer.DateTimeSerializer;
import org.openstack.atlas.api.helpers.JsonSerializer.ObjectWrapperSerializer;
import org.openstack.atlas.api.helpers.JsonSerializer.PropertyCollectionSerializer;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.Host;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.RateLimit;
import org.openstack.atlas.docs.loadbalancers.api.v1.*;
import org.w3.atom.Link;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.AccountRecord;
import org.openstack.atlas.docs.loadbalancers.api.management.v1.HostMachineDetails;
public class JsonObjectMapper extends ObjectMapper {
public void init() {
CustomSerializerFactory csf = new CustomSerializerFactory();
CustomDeserializerFactory cdf = new CustomDeserializerFactory();
SerializationConfig serConf = this.getSerializationConfig();
DeserializationConfig deserConf = this.getDeserializationConfig();
csf.addSpecificMapping(GregorianCalendar.class, new DateTimeSerializer(serConf, null));
cdf.addSpecificMapping(Calendar.class, new DateTimeDeserializer(Calendar.class));
Class[] serializerWrapperClasses = new Class[]{HostMachineDetails.class, AccountRecord.class, HealthMonitor.class,
SessionPersistence.class, ConnectionLogging.class, ConnectionThrottle.class, Meta.class,
Node.class, RateLimit.class, Errorpage.class, SslTermination.class, CertificateMapping.class,
Link.class, AllowedDomain.class, ContentCaching.class};
Class[] deserializerWrapperClasses = new Class[]{HostMachineDetails.class, AccountRecord.class, Node.class, HealthMonitor.class,
SessionPersistence.class, ConnectionLogging.class, Meta.class, ConnectionThrottle.class, LoadBalancer.class,
NetworkItem.class, RateLimit.class, Errorpage.class, SslTermination.class, CertificateMapping.class,
Host.class, Link.class, AllowedDomain.class, ContentCaching.class};
for (Class wrapperClass : serializerWrapperClasses) {
csf.addSpecificMapping(wrapperClass, new ObjectWrapperSerializer(serConf, wrapperClass));
}
for (Class wrapperClass : deserializerWrapperClasses) {
cdf.addSpecificMapping(wrapperClass, new ObjectWrapperDeserializer(wrapperClass));
}
cdf.addSpecificMapping(LoadBalancer.class, new ObjectWrapperDeserializer(LoadBalancer.class));
// Define any collections utilizing the custom serializers above to
// use the clean collections serializer, which will ensure proper JSON
// formatting.
// Load balancer is a bit of a special case since we want loadbalancer
// wrapped, but none of the collections within loadbalancer.
csf.addSpecificMapping(LoadBalancer.class, new ObjectWrapperSerializer(this.getSerializationConfig(), LoadBalancer.class));
csf.addSpecificMapping(LoadBalancers.class, new PropertyCollectionSerializer(serConf, LoadBalancers.class, "getLoadBalancers", true));
csf.addSpecificMapping(AccessList.class, new PropertyCollectionSerializer(serConf, AccessList.class, "getNetworkItems"));
csf.addSpecificMapping(Nodes.class, new PropertyCollectionSerializer(serConf, Nodes.class, "getNodes"));
csf.addSpecificMapping(Metadata.class, new PropertyCollectionSerializer(serConf, Metadata.class, "getMetas"));
cdf.addSpecificMapping(Metadata.class, new PropertyListDeserializer(Metadata.class, Meta.class, "getMetas"));
cdf.addSpecificMapping(AccessList.class, new PropertyListDeserializer(AccessList.class, NetworkItem.class, "getNetworkItems"));
this.setSerializerFactory(csf);
this.setDeserializerProvider(new DeserializerProviderBuilder(cdf));
// Suppress null properties from being serialized.
this.configure(SerializationConfig.Feature.WRITE_NULL_PROPERTIES, false);
serConf.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
}
}