package net.floodlightcontroller.restserver;

import org.codehaus.jackson.Version;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.module.SimpleModule;
import org.codehaus.jackson.map.ser.CustomSerializerFactory;
import org.restlet.ext.jackson.JacksonRepresentation;
import org.restlet.representation.Representation;

/**
 * Helper class used to dynamically override the default serializers used for
 * JSON serialization.
 * <p/>
 * Serializers can be added to the helper class at runtime using
 * {@link #addSerializer(Class, JsonSerializer)}. The serializers contained by
 * the helper class can then be added to a JacksonRepresentation prior to
 * serializing it using {@link #applySerializers(JacksonRepresentation)}.
 * <p/>
 * This class enables the use of custom serializers for Java objects without
 * having to hardcode the mapping of class to serializer using
 * annotations on the class. Any serialization annotations on the class will be
 * overridden by the serializers used here, so different serializers can be
 * used on the class in different contexts.
 */
public class CustomSerializerHelper {
    private final ObjectMapper mapper;
    private final SimpleModule customSerializerModule;
    private CustomSerializerFactory sf;

    /**
     * Constructor.
     */
    public CustomSerializerHelper() {
        mapper = new ObjectMapper();
        customSerializerModule = new SimpleModule("custom-serializers", new Version(1, 0, 0, null));
        mapper.registerModule(customSerializerModule);
        sf =  new CustomSerializerFactory();
    }

    /**
     * Adds a serializer to the set of serializers that will be used for JSON
     * serialization.
     *
     * @param serializer the serializer to add
     */
    public <T> void addSerializer(Class<T> clazz, JsonSerializer<T> serializer) {
        customSerializerModule.addSerializer(serializer);
        sf.addGenericMapping(clazz, serializer);
    }

    /**
     * Applies the list of serializers to the JacksonRepresentation so they
     * will be used when the object in the representation is serialized
     *
     * @param jacksonRepresentation the representation to apply the serializers
     * to
     * @return a representation with the custom serializers applied
     */
    public Representation applySerializers(JacksonRepresentation<?> jacksonRepresentation) {
        mapper.registerModule(customSerializerModule);
        jacksonRepresentation.setObjectMapper(mapper);
        mapper.setSerializerFactory(sf);
        return jacksonRepresentation;
    }
}
