package net.floodlightcontroller.core.web.serializers;
import java.io.IOException;
import java.util.List;
import net.floodlightcontroller.util.InstructionUtils;
import org.projectfloodlight.openflow.protocol.instruction.OFInstruction;
import org.projectfloodlight.openflow.protocol.instruction.OFInstructionApplyActions;
import org.projectfloodlight.openflow.protocol.instruction.OFInstructionExperimenter;
import org.projectfloodlight.openflow.protocol.instruction.OFInstructionGotoTable;
import org.projectfloodlight.openflow.protocol.instruction.OFInstructionMeter;
import org.projectfloodlight.openflow.protocol.instruction.OFInstructionStatTrigger;
import org.projectfloodlight.openflow.protocol.instruction.OFInstructionWriteActions;
import org.projectfloodlight.openflow.protocol.instruction.OFInstructionWriteMetadata;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
/**
* Serialize any List of OFInstruction in JSON.
*
* Use automatically by Jackson via JsonSerialize(using=OFInstructionListSerializer.class),
* or use the static function within this class within another serializer.
*
* @author Ryan Izard, ryan.izard@bigswitch.com, rizard@g.clemson.edu
*/
public class OFInstructionListSerializer extends JsonSerializer<List<OFInstruction>> {
@Override
public void serialize(List<OFInstruction> instructions, JsonGenerator jGen, SerializerProvider serializer) throws IOException,
JsonProcessingException {
serializeInstructionList(jGen, instructions);
}
public static void serializeInstructionList(JsonGenerator jGen, List<OFInstruction> instructions) throws IOException, JsonProcessingException {
jGen.writeObjectFieldStart("instructions");
if (instructions.isEmpty()) {
jGen.writeStringField("none", "drop");
} else {
for (OFInstruction i : instructions) {
switch (i.getType()) {
case CLEAR_ACTIONS:
jGen.writeObjectFieldStart(InstructionUtils.STR_CLEAR_ACTIONS);
break;
case WRITE_METADATA:
jGen.writeObjectFieldStart(InstructionUtils.STR_WRITE_METADATA);
jGen.writeNumberField(InstructionUtils.STR_WRITE_METADATA, ((OFInstructionWriteMetadata)i).getMetadata().getValue());
jGen.writeNumberField(InstructionUtils.STR_WRITE_METADATA + "_mask", ((OFInstructionWriteMetadata)i).getMetadataMask().getValue());
break;
case EXPERIMENTER:
jGen.writeObjectFieldStart(InstructionUtils.STR_EXPERIMENTER);
jGen.writeNumberField(InstructionUtils.STR_EXPERIMENTER, ((OFInstructionExperimenter)i).getExperimenter());
break;
case GOTO_TABLE:
jGen.writeObjectFieldStart(InstructionUtils.STR_GOTO_TABLE);
jGen.writeNumberField(InstructionUtils.STR_GOTO_TABLE, ((OFInstructionGotoTable)i).getTableId().getValue());
break;
case METER:
jGen.writeObjectFieldStart(InstructionUtils.STR_GOTO_METER);
jGen.writeNumberField(InstructionUtils.STR_GOTO_METER, ((OFInstructionMeter)i).getMeterId());
break;
case APPLY_ACTIONS:
jGen.writeObjectFieldStart(InstructionUtils.STR_APPLY_ACTIONS);
OFActionListSerializer.serializeActions(jGen, ((OFInstructionApplyActions)i).getActions());
break;
case WRITE_ACTIONS:
jGen.writeObjectFieldStart(InstructionUtils.STR_WRITE_ACTIONS);
OFActionListSerializer.serializeActions(jGen, ((OFInstructionWriteActions)i).getActions());
case DEPRECATED:
jGen.writeObjectFieldStart(InstructionUtils.STR_DEPRECATED);
break;
case STAT_TRIGGER:
jGen.writeFieldName(InstructionUtils.STR_STAT_TRIGGER);
InstructionUtils.statTriggerToJsonString(jGen, (OFInstructionStatTrigger)i);
break;
} // end switch on instruction
jGen.writeEndObject(); // end specific instruction
} // end for instructions
} // end process instructions (OF1.1+ only)
jGen.writeEndObject(); // end object (either has instructions or a "none":"drop" key:value as specified above)
} // end not-empty instructions (else)
}