package com.github.bjuvensjo.rsimulator.core.handler.regexp;
import com.google.inject.Singleton;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.map.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Iterator;
import java.util.Map.Entry;
/**
* JsonHandler is a regular expression handler for json (.json).
*
* @author Magnus Bjuvensjö
* @see AbstractHandler
*/
@Singleton
public class JsonHandler extends AbstractHandler {
private static final String EXTENSION = "json";
private Logger log = LoggerFactory.getLogger(JsonHandler.class);
private ObjectMapper mapper;
public JsonHandler() {
super();
mapper = new ObjectMapper();
}
/**
* {@inheritDoc}
*/
@Override
protected String escape(String request, boolean isCandidate) {
String result = request;
if (isCandidate && request != null && !"".equals(request)) {
try {
StringBuilder sb = new StringBuilder();
JsonNode rootNode = mapper.readValue(request, JsonNode.class);
escape(sb, rootNode, null);
result = sb.toString();
} catch (Exception e) {
log.error(null, e);
}
}
return result;
}
/**
* {@inheritDoc}
*/
@Override
protected String format(String request) {
String result = request;
if (request != null && !"".equals(request)) {
try {
JsonNode rootNode = mapper.readValue(request, JsonNode.class);
result = mapper.writeValueAsString(rootNode);
} catch (Exception e) {
log.error(null, e);
}
}
return result;
}
private void escape(StringBuilder sb, JsonNode node, String name) {
if (node.isArray()) {
sb.append("\\[");
Iterator<JsonNode> iterator = node.iterator();
int n = 0;
while (iterator.hasNext()) {
if (n > 0) {
sb.append(",");
}
n++;
escape(sb, iterator.next(), null);
}
sb.append("\\]");
} else if (node.isObject()) {
sb.append("\\{");
Iterator<Entry<String, JsonNode>> fields = node.getFields();
int n = 0;
while (fields.hasNext()) {
if (n > 0) {
sb.append(",");
}
n++;
Entry<String, JsonNode> field = fields.next();
escape(sb, field.getValue(), field.getKey());
}
sb.append("\\}");
} else {
sb.append("\"").append(name).append("\":").append(node.toString());
}
}
/**
* {@inheritDoc}
*/
@Override
protected String getExtension() {
return EXTENSION;
}
}