/**
*    Copyright 2011, Big Switch Networks, Inc. 
*    Originally created by David Erickson, Stanford University
* 
*    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 org.openflow.protocol.serializers;

import java.io.IOException;

import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.SerializerProvider;
import org.openflow.protocol.OFMatch;
import org.openflow.util.HexString;

public class OFMatchJSONSerializer extends JsonSerializer<OFMatch> {

    /**
     * Converts an IP in a 32 bit integer to a dotted-decimal string
     * @param i The IP address in a 32 bit integer
     * @return An IP address string in dotted-decimal
     */
    private String intToIp(int i) {
        return ((i >> 24 ) & 0xFF) + "." +
               ((i >> 16 ) & 0xFF) + "." +
               ((i >>  8 ) & 0xFF) + "." +
               ( i        & 0xFF);
    }

    /**
     * Performs the serialization of a OFMatch object
     */
    @Override
    public void serialize(OFMatch match, JsonGenerator jGen, 
                                SerializerProvider serializer) 
                                throws IOException, JsonProcessingException {
        jGen.writeStartObject();
        jGen.writeStringField("dataLayerDestination", 
                    HexString.toHexString(match.getDataLayerDestination()));
        jGen.writeStringField("dataLayerSource", 
                    HexString.toHexString(match.getDataLayerSource()));
        String dataType = Integer.toHexString(match.getDataLayerType());
        while (dataType.length() < 4) {
            dataType = "0".concat(dataType);
        }
        jGen.writeStringField("dataLayerType", "0x" + dataType);
        jGen.writeNumberField("dataLayerVirtualLan", 
                    match.getDataLayerVirtualLan());
        jGen.writeNumberField("dataLayerVirtualLanPriorityCodePoint", 
                    match.getDataLayerVirtualLanPriorityCodePoint());
        jGen.writeNumberField("inputPort", match.getInputPort());
        jGen.writeStringField("networkDestination", 
                    intToIp(match.getNetworkDestination()));
        jGen.writeNumberField("networkDestinationMaskLen", 
                    match.getNetworkDestinationMaskLen());
        jGen.writeNumberField("networkProtocol", match.getNetworkProtocol());
        jGen.writeStringField("networkSource", 
                    intToIp(match.getNetworkSource()));
        jGen.writeNumberField("networkSourceMaskLen", 
                    match.getNetworkSourceMaskLen());
        jGen.writeNumberField("networkTypeOfService", 
                    match.getNetworkTypeOfService());
        jGen.writeNumberField("transportDestination", 
                    match.getTransportDestination());
        jGen.writeNumberField("transportSource", 
                    match.getTransportSource());
        jGen.writeNumberField("wildcards", match.getWildcards());
        jGen.writeEndObject();
    }

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