/**
* Copyright 2012 InCNTRE, This file is released under Apache 2.0 license except for component libraries under different licenses
http://www.apache.org/licenses/LICENSE-2.0
*/
package edu.iu.incntre.flowscale.util;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.openflow.protocol.OFPhysicalPort;
import org.openflow.protocol.statistics.OFAggregateStatisticsReply;
import org.openflow.protocol.statistics.OFFlowStatisticsReply;
import org.openflow.protocol.statistics.OFPortStatisticsReply;
import org.openflow.protocol.statistics.OFStatistics;
import org.openflow.protocol.statistics.OFTableStatistics;
import org.openflow.util.HexString;
import edu.iu.incntre.flowscale.FlowscaleController;
/**
* Uility class to convert structure in openflowj to json
* @author Ali Khalfan
*
*/
public class JSONConverter {
/**
* convert from status of OFPhysicalPort to JSONArray
* @param portList
* @return JSONArray of an ArrayList<OFPhysicalPort>
*/
public static JSONArray toPortStatus(List<OFPhysicalPort> portList){
JSONArray jsonArray = new JSONArray();
for (OFPhysicalPort pp : portList) {
JSONObject obj = new JSONObject();
if (pp.getPortNumber() <0) {
continue;
}
obj.put("port_id", pp.getPortNumber());
obj.put("port_address",
HexString.toHexString(pp.getHardwareAddress()));
obj.put("config", pp.getConfig());
obj.put("supported", pp.getSupportedFeatures());
obj.put("current", pp.getCurrentFeatures());
obj.put("state", pp.getState());
FlowscaleController.logger.debug("port {}", pp.getPortNumber());
FlowscaleController.logger.debug("h/w {}",
HexString.toHexString(pp.getHardwareAddress()));
FlowscaleController.logger.debug("state {}", pp.getState());
FlowscaleController.logger.debug("-------");
jsonArray.add(obj);
}
return jsonArray;
}
/**
* convert List<OFStatistics> to JSONArray
* @param ofs
* @return JSONArray
*/
public static JSONArray toTableStat(List<OFStatistics> ofs){
JSONArray jsonArray = new JSONArray();
for (OFStatistics ofst : ofs) {
OFTableStatistics st = (OFTableStatistics) ofst;
// st.getPortNumber() st.getReceiveBytes();
FlowscaleController.logger.debug(
"Maximum Entries {} and and Table id {}",
st.getMaximumEntries(), st.getTableId());
FlowscaleController.logger.debug(
"Name {} and and Table length {}", st.getName(),
st.getLength());
JSONObject jsonObject = new JSONObject();
jsonObject.put("match_count", st.getMatchedCount());
jsonObject.put("maximum_entries", st.getMaximumEntries());
jsonObject.put("name", st.getName());
jsonObject.put("table_id", st.getTableId());
jsonObject.put("active_count", st.getActiveCount());
jsonArray.add(jsonObject);
}
return jsonArray;
}
/**
* convert from general List<OFStatistics>
* @param ofs
* @param type
* @return JSONArray of a List
*/
public static JSONArray toStat(List<OFStatistics> ofs, String type){
JSONArray jsonArray = new JSONArray();
if (type.equals("aggregate")) {
return toAggregateStat(ofs);
} else if (type.equals("table")) {
return toTableStat(ofs);
} else if (type.equals("flow")) {
return toFlowStat(ofs);
} else if (type.equals("port")) {
return toPortStat(ofs);
}
return jsonArray;
}
public static JSONArray toPortStat(List<OFStatistics> ofs){
JSONArray jsonArray = new JSONArray();
for (OFStatistics ofst : ofs) {
OFPortStatisticsReply st = (OFPortStatisticsReply) ofst;
JSONObject jsonObject = new JSONObject();
if (st.getPortNumber() < -2) {
continue;
}
jsonObject.put("port_id", st.getPortNumber());
jsonObject.put("receive_packets", st.getreceivePackets());
jsonObject.put("transmit_packets", st.getTransmitPackets());
jsonObject.put("receive_bytes", st.getReceiveBytes());
jsonObject.put("transmit_bytes", st.getTransmitBytes());
jsonArray.add(jsonObject);
}
return jsonArray;
}
/**
* convert a list of flows to JSONArray
* @param ofs
* @return JSONArray of flows
*/
public static JSONArray toFlowStat(List<OFStatistics> ofs){
JSONArray jsonArray = new JSONArray();
for (OFStatistics ofst : ofs) {
OFFlowStatisticsReply st = (OFFlowStatisticsReply) ofst;
JSONObject jsonObject = new JSONObject();
String[] a = st.getActions().toString().split("port=");
String c;
c = st.getActions().toString();
if (a.length == 1) {
c = st.getActions().toString();
} else {
String[] b = a[1].split(",");
c = b[0];
}
// parse the output
String outputString = "";
try {
Pattern pattern = Pattern.compile("port=\\w*");
Matcher matcher = pattern.matcher(st.getActions()
.toString());
while (matcher.find()) {
outputString += matcher.group().split("=")[1] + ",";
}
} catch (PatternSyntaxException pse) {
outputString = "malformed";
}
if (outputString.length() == 0) {
outputString = "DROP,";
}
jsonObject.put("actions",
outputString.substring(0, outputString.length() - 1));
jsonObject.put("hard_timeout", st.getHardTimeout());
jsonObject.put("idle_timeout", st.getIdleTimeout());
jsonObject.put("match", st.getMatch().toString());
jsonObject.put("priority", st.getPriority());
jsonObject.put("packet_count", st.getPacketCount());
jsonObject.put("byte_count", st.getByteCount());
jsonObject.put("table_id", st.getTableId());
jsonArray.add(jsonObject);
}
if (jsonArray.size() == 0) {
JSONObject jso = new JSONObject();
jso.put("data", "nono");
}
return jsonArray;
}
/**
* convert from aggregate stats to JSONArray
*
* @param ofs
* @return JSONArray of aggregate stats
*/
public static JSONArray toAggregateStat(List<OFStatistics> ofs){
JSONArray jsonArray = new JSONArray();
for (OFStatistics ofst : ofs) {
OFAggregateStatisticsReply st = (OFAggregateStatisticsReply) ofst;
JSONObject jsonObject = new JSONObject();
jsonObject.put("packet_count", st.getPacketCount());
jsonObject.put("flow_count", st.getFlowCount());
jsonArray.add(jsonObject);
}
return jsonArray;
}
}