package net.floodlightcontroller.debugcounter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.floodlightcontroller.debugcounter.IDebugCounterService.DebugCounterInfo;
import org.restlet.resource.Get;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Return the debug counter data for the get rest-api call
*
* URI must be in one of the following forms:
* "http://{controller-hostname}:8080/wm/core/debugcounter/{param}/json
*
* where {param} must be one of (no quotes):
* "all" returns value/info on all active counters.
* "{moduleName}" returns value/info on all active counters for the specified module.
* "{moduleCounterName}" returns value/info for specific counter if it is enabled.
*
* @author Saurav
*/
public class DebugCounterGetResource extends DebugCounterResourceBase {
protected static Logger logger =
LoggerFactory.getLogger(DebugCounterGetResource.class);
/**
* The output JSON model that contains the counter information
*/
public static class DebugCounterInfoOutput {
public Map<String, DebugCounterInfo> counterMap;
public String error;
DebugCounterInfoOutput() {
counterMap = new HashMap<String, DebugCounterInfo>();
error = null;
}
public Map<String, DebugCounterInfo> getCounterMap() {
return counterMap;
}
public String getError() {
return error;
}
}
public enum Option {
ALL, ONE_MODULE, ONE_MODULE_COUNTER, ERROR_BAD_MODULE_NAME, ERROR_BAD_PARAM,
ERROR_BAD_MODULE_COUNTER_NAME
}
@Get("json")
public DebugCounterInfoOutput handleCounterInfoQuery() {
DebugCounterInfoOutput output = new DebugCounterInfoOutput();
Option choice = Option.ERROR_BAD_PARAM;
String param = (String)getRequestAttributes().get("param");
if (param == null) {
param = "all";
choice = Option.ALL;
} else if (param.equals("all")) {
choice = Option.ALL;
} else if (param.contains("-")) {
// differentiate between disabled and non-existing counters
boolean isRegistered = debugCounter.containsMCName(param);
if (isRegistered) {
choice = Option.ONE_MODULE_COUNTER;
} else {
choice = Option.ERROR_BAD_MODULE_COUNTER_NAME;
}
} else {
boolean isRegistered = debugCounter.containsModName(param);
if (isRegistered) {
choice = Option.ONE_MODULE;
} else {
choice = Option.ERROR_BAD_MODULE_NAME;
}
}
switch (choice) {
case ALL:
poplulateAllCounters(debugCounter.getAllCounterValues(), output);
break;
case ONE_MODULE:
populateModuleCounters(debugCounter.getModuleCounterValues(param), output);
break;
case ONE_MODULE_COUNTER:
populateSingleCounter(debugCounter.getCounterValue(param), output);
break;
case ERROR_BAD_MODULE_NAME:
output.error = "Module name has no corresponding registered counters";
break;
case ERROR_BAD_MODULE_COUNTER_NAME:
output.error = "Counter not registered";
break;
case ERROR_BAD_PARAM:
output.error = "Bad param";
}
return output;
}
private void populateSingleCounter(DebugCounterInfo debugCounterInfo,
DebugCounterInfoOutput output) {
if (debugCounterInfo != null)
output.counterMap.put(debugCounterInfo.counterInfo.moduleCounterName,
debugCounterInfo);
}
private void populateModuleCounters(List<DebugCounterInfo> moduleCounterValues,
DebugCounterInfoOutput output) {
for (DebugCounterInfo dci : moduleCounterValues) {
populateSingleCounter(dci, output);
}
}
private void poplulateAllCounters(List<DebugCounterInfo> allCounterValues,
DebugCounterInfoOutput output) {
for (DebugCounterInfo dci : allCounterValues) {
populateSingleCounter(dci, output);
}
}
}