package com.github.fge.jsonschema.process;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.github.fge.jackson.JacksonUtils;
import com.github.fge.jackson.JsonNodeReader;
import com.github.fge.jsonschema.constants.ParseError;
import com.github.fge.jsonschema.core.exceptions.ProcessingException;
import com.github.fge.jsonschema.core.report.ProcessingMessage;
import com.github.fge.jsonschema.core.report.ProcessingReport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.ws.rs.Consumes;
import javax.ws.rs.FormParam;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.StringReader;
@Produces("application/json;charset=utf-8")
public abstract class Processing
{
private static final Response BAD = Response.status(400).build();
private static final Response OOPS = Response.status(500).build();
private static final JsonNodeReader NODE_READER
= new JsonNodeReader();
protected static final JsonNodeFactory FACTORY = JacksonUtils.nodeFactory();
private final Logger logger;
protected Processing()
{
logger = LoggerFactory.getLogger(getClass());
}
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public final Response doProcess(@FormParam("input") final String input)
{
if (input == null)
return BAD;
try {
final JsonNode ret = buildResult(input);
final String out = JacksonUtils.prettyPrint(ret);
return Response.ok().entity(out).build();
} catch (IOException e) {
logger.error("I/O error while building response", e);
return OOPS;
} catch (ProcessingException e) {
logger.error("Processing exception while building response", e);
return OOPS;
}
}
protected abstract JsonNode buildResult(final String input)
throws IOException, ProcessingException;
protected static boolean fillWithData(final ObjectNode node,
final String onSuccess, final String onFailure, final String raw)
throws IOException
{
try {
node.put(onSuccess, NODE_READER.fromReader(new StringReader(raw)));
return false;
} catch (JsonProcessingException e) {
node.put(onFailure, ParseError.build(e, raw.contains("\r\n")));
return true;
}
}
protected static JsonNode buildReport(final ProcessingReport report)
{
final ArrayNode ret = FACTORY.arrayNode();
for (final ProcessingMessage message: report)
ret.add(message.asJson());
return ret;
}
}