/** * Copyright (C) 2013 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.doctester.testbrowser; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.JacksonXmlModule; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import java.io.IOException; /** * * The response from a call done with the TestBrowser. * * @author Raphael A. Bauer * */ public class Response { private final Logger logger = LoggerFactory.getLogger(Response.class); public final Map<String, String> headers; public final int httpStatus; public final String payload; private final XmlMapper xmlMapper; private final ObjectMapper objectMapper; public Response(Map<String, String> headers, int httpStatus, String payload) { // configure the JacksonXml mapper in a cleaner way... JacksonXmlModule module = new JacksonXmlModule(); // Check out: https://github.com/FasterXML/jackson-dataformat-xml // setDefaultUseWrapper produces more similar output to // the Json output. You can change that with annotations in your // models. module.setDefaultUseWrapper(false); this.xmlMapper = new XmlMapper(module); this.objectMapper = new ObjectMapper(); this.headers = headers; this.httpStatus = httpStatus; this.payload = payload; } /** * * @return The payload of this response as String. Just the raw String. * */ public String payloadAsString() { return payload; } /** * * @return The payload of this response as String. It tries to determine the * content and format the content in a pretty way. Currently works for json. * */ public String payloadAsPrettyString() { try { return PayloadUtils.prettyPrintResponsePayload(payload, headers); } catch (IOException ex) { logger.error("Something went wrong when pretty printing response payload: " + ex.toString()); return "Error pretty printing the payload."; } } /** * Parses response into Plain old Java objects. First checks header * Content-Type and then converts object into suitable Pojo object. Can * handle "application/xmlObject" and "application/xml". If you want to * force the parsing of a certain content type check out payloadJsonAs/...) * and payloadXmlAs(...). * * @param clazz The class to use as blueprint for parsing the response body. * @return An instance of the class or null if parsing went wrong. */ public <T> T payloadAs(Class<T> clazz) { T parsedBody = null; if (PayloadUtils.isContentTypeApplicationXml(headers)) { parsedBody = payloadXmlAs(clazz); } else if (PayloadUtils.isContentTypeApplicationJson(headers)) { parsedBody = payloadJsonAs(clazz); } else { logger.error("Could neither find application/json or application/xml content type in response. Returning null."); } return parsedBody; } /** * The payload of this request de-serialized into the specified class type. * The payload must be valid Xml. * * @param clazz The class type that should be used to de-serialize the * payload. * @return An instance of clazz filled with data from the payload. */ public <T> T payloadXmlAs(Class<T> clazz) { T parsedBody = null; try { parsedBody = this.xmlMapper.readValue(payload, clazz); } catch (Exception e) { logger.error("Something went wrong parsing the payload of this response into Xml", e); } return parsedBody; } /** * The payload of this request de-serialized into the specified * TypeReference. The payload must be Xml. * * @param typeReference The TypeReference that should be used to * de-serialize the payload. * @return An instance of clazz filled with data from the payload. */ public <T> T payloadXmlAs(TypeReference<T> typeReference) { T parsedBody = null; try { parsedBody = xmlMapper.readValue(payload, typeReference); } catch (IOException e) { logger.error("Something went wrong parsing the payload of this response into Xml", e); } return parsedBody; } /** * The payload of this request de-serialized into the specified class type. * The payload must be Json. * * @param clazz The class type that should be used to de-serialize the * payload. * @return An instance of clazz filled with data from the payload. */ public <T> T payloadJsonAs(Class<T> clazz) { T parsedBody = null; try { parsedBody = objectMapper.readValue(payload, clazz); } catch (IOException e) { logger.error("Something went wrong parsing the payload of this response into Json", e); } return parsedBody; } /** * The payload of this request de-serialized into the specified * TypeReference. The payload must be Json. * * @param typeReference The TypeReference that should be used to de-serialize * the payload. * @return An instance of clazz filled with data from the payload. */ public <T> T payloadJsonAs(TypeReference<T> typeReference) { T parsedBody = null; try { parsedBody = objectMapper.readValue(payload, typeReference); } catch (IOException e) { logger.error("Something went wrong parsing the payload of this response into Json", e); } return parsedBody; } }