/**
 *    Copyright 2011, Big Switch Networks, Inc.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License"); you may
 *    not use this file except in compliance with the License. You may obtain
 *    a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 *    License for the specific language governing permissions and limitations
 *    under the License.
 **/

package net.floodlightcontroller.util;

import java.io.IOException;
import java.sql.Timestamp;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;


/**
 * @author subrata
 */

public class EventHistoryBaseInfoJSONSerializer extends
        JsonSerializer<EventHistoryBaseInfo> {


    /**
     * Performs the serialization of a EventHistory.BaseInfo object
     */
    @Override
    public void serialize(EventHistoryBaseInfo base_info, JsonGenerator jGen,
                          SerializerProvider serializer)
            throws IOException, JsonProcessingException {
        jGen.writeStartObject();
        jGen.writeNumberField("Idx", base_info.getIdx());
        Timestamp ts = new Timestamp(base_info.getTime_ms());
        String tsStr = ts.toString();
        while (tsStr.length() < 23) {
            tsStr = tsStr.concat("0");
        }
        jGen.writeStringField("Time", tsStr);
        jGen.writeStringField("State", base_info.getState().name());
        String acStr = base_info.getAction().name().toLowerCase();
        // Capitalize the first letter
        acStr = acStr.substring(0, 1).toUpperCase().concat(acStr.substring(1));
        jGen.writeStringField("Action", acStr);
        jGen.writeEndObject();
    }

    /**
     * Tells SimpleModule that we are the serializer for OFMatch
     */
    @Override
    public Class<EventHistoryBaseInfo> handledType() {
        return EventHistoryBaseInfo.class;
    }
}
