package com.mobilesorcery.sdk.core.stats;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
public class Variables implements IVariable {
private static final String TYPE = "vars";
private final HashMap<String, IVariable> variables = new HashMap<String, IVariable>();
public <T extends IVariable> T get(Class<T> clazz, String variableKey) {
IVariable variable = variables.get(variableKey);
if (variable == null || !clazz.isAssignableFrom(variable.getClass())) {
try {
variable = clazz.newInstance();
variables.put(variableKey, variable);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return (T) variable;
}
public void write(Writer output) throws IOException {
JSONObject outputObject = new JSONObject();
write(outputObject);
outputObject.writeJSONString(output);
}
@Override
public void write(JSONObject output) {
for (Map.Entry<String, IVariable> variableEntry : variables.entrySet()) {
String key = variableEntry.getKey();
IVariable v = variableEntry.getValue();
JSONObject o = new JSONObject();
o.put("type", v.getType());
v.write(o);
output.put(key, o);
}
}
public void read(Reader input) throws IOException, ParseException {
JSONParser parser = new JSONParser();
JSONObject inputObject = (JSONObject) parser.parse(input);
read(inputObject);
}
@Override
public void read(JSONObject input) {
for (Object key : input.keySet()) {
String keyStr = (String) key;
JSONObject value = (JSONObject) input.get(keyStr);
IVariable var = getVariable(value);
if (var != null) {
variables.put(keyStr, var);
}
}
}
private IVariable getVariable(JSONObject o) {
String type = (String) o.get("type");
IVariable result = null;
// Ok, if this starts to get more complex, use xstream or smth.
if (CounterVariable.TYPE.equals(type)) {
result = new CounterVariable();
} else if (DecimalVariable.TYPE.equals(type)) {
result = new DecimalVariable();
} else if (TimeStamp.TYPE.equals(type)) {
result = new TimeStamp();
} else if (StringVariable.TYPE.equals(type)) {
result = new StringVariable();
}
if (result != null) {
result.read(o);
}
return result;
}
@Override
public String getType() {
return TYPE;
}
}