package net.onrc.onos.core.flowmanager.web;

import java.io.IOException;
import java.util.Collection;

import net.floodlightcontroller.restserver.CustomSerializerHelper;
import net.onrc.onos.api.flowmanager.Flow;
import net.onrc.onos.api.flowmanager.FlowId;
import net.onrc.onos.api.flowmanager.FlowManagerFloodlightService;

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.ser.std.SerializerBase;
import org.restlet.ext.jackson.JacksonRepresentation;
import org.restlet.representation.Representation;
import org.restlet.resource.Get;
import org.restlet.resource.ServerResource;

/**
 * Handles REST requests for flow resources.
 */
public class FlowResource extends ServerResource {

    private CustomSerializerHelper flowSerializers;

    /**
     * Constructs a FlowResource.
     * <p/>
     * A custom serializer for {@link FlowId} is automatically registered,
     * because FlowId can't be serialized by default.
     */
    public FlowResource() {
        flowSerializers = new CustomSerializerHelper();
        flowSerializers.addSerializer(FlowId.class, new SerializerBase<FlowId>(FlowId.class) {
            @Override
            public void serialize(FlowId flowId, JsonGenerator jgen,
                    SerializerProvider provider) throws IOException,
                    JsonGenerationException {
                jgen.writeString(flowId.toString());
            }
        });
    }

    /**
     * Handles REST requests for all flow resources.
     *
     * @return JSON-serializable Representation of all flow resources
     */
    @Get("json")
    public Representation retrieve() {
        FlowManagerFloodlightService flowService =
                (FlowManagerFloodlightService) getContext().getAttributes()
                    .get(FlowManagerFloodlightService.class.getCanonicalName());

        Collection<Flow> flows = flowService.getFlows();

        return flowSerializers.applySerializers(
                (JacksonRepresentation<?>) toRepresentation(flows, null));
    }

}
