package com.flexmls.flexmls_api; import java.io.IOException; import java.io.InputStream; import org.apache.http.HttpResponse; import org.apache.http.client.ResponseHandler; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.map.ObjectMapper; /** * JSON client parser for the HTTP response. */ public class JsonResponseHandler implements ResponseHandler<Response> { // TODO When jackson 1.8 is released, investigate using the private ObjectMapper mapper = new ObjectMapper(); @Override public Response handleResponse(HttpResponse response) { Response r; try { InputStream content = response.getEntity().getContent(); int statusCode = response.getStatusLine().getStatusCode(); r = parseResponse(content, statusCode); } catch (IOException e) { r = new Response(new FlexmlsApiClientException("Failure parsing JSON resonse. The server response may be invalid", e)); } return r; } /** * Parse the response JSON into the standard API response object. * @param content response content * @param statusCode response HTTP status * @return A response object * @throws IOException */ public Response parseResponse(InputStream content, int statusCode) throws IOException { JsonNode root; Response r = null; root = mapper.readValue(content, JsonNode.class); r = parse(root, statusCode); return r; } private Response parse(JsonNode root, int status){ // can reuse, share globally JsonNode rootNode = root.get("D"); Response r = new Response(mapper, rootNode); r.setSuccess(rootNode.get("Success").getValueAsBoolean()); r.setStatus(status); if(!r.isSuccess()){ r.setCode(rootNode.get("Code").getValueAsInt()); r.setMessage(rootNode.get("Message").getValueAsText()); } // TODO pagination return r; } }