package com.intuit.tank.http.json; /* * #%L * Intuit Tank Agent (apiharness) * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.net.URLDecoder; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.commons.jxpath.JXPathContext; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.json.JSONObject; import org.json.simple.parser.ContainerFactory; import org.json.simple.parser.JSONParser; import com.intuit.tank.http.BaseResponse; public class JsonResponse extends BaseResponse { static protected Logger logger = LogManager.getLogger(JsonResponse.class); @SuppressWarnings("rawtypes") private Map jsonMap = null; public JsonResponse() { this(""); } public JsonResponse(String resp) { this.setResponseBody(resp); } @Override public void setResponseBody(String body) { this.response = this.cleanString(body); } @Override public void setResponseBody(byte[] byteArray) { this.responseByteArray = byteArray; this.response = this.cleanString(new String(byteArray)); } @Override public String getValue(String key) { try { if (NumberUtils.isDigits(key)) { Integer.parseInt(key); JSONObject jsonResponse = new JSONObject(this.response); return (String) jsonResponse.get(key); } } catch (Exception e) { } try { if (this.jsonMap == null) { initialize(); } String keyTrans = key.replace("@", ""); // note that indexing is 1 based not zero based JXPathContext context = JXPathContext.newContext(this.jsonMap); String output = URLDecoder.decode(String.valueOf(context.getValue(keyTrans)), "UTF-8"); if (output.equalsIgnoreCase("null")) return ""; return output; } catch (Exception ex) { return ""; } } private String cleanString(String input) { try { String output = StringUtils.remove(input.trim(), "@"); return StringUtils.remove(output,"(\r\n)+"); } catch (Exception ex) { return input; } } @SuppressWarnings({ "rawtypes", "unchecked" }) private void initialize() { try { JSONParser parser = new JSONParser(); ContainerFactory containerFactory = new ContainerFactory() { public List creatArrayContainer() { return new LinkedList(); } public Map createObjectContainer() { return new LinkedHashMap(); } }; if (!StringUtils.isEmpty(this.response)) { Object parse = parser.parse(this.response, containerFactory); if (parse instanceof List) { this.jsonMap = new LinkedHashMap(); } else { this.jsonMap = (Map) parse; } this.jsonMap.put("root", parse); } else { this.jsonMap = new HashMap(); } } catch (Exception ex) { logger.warn("Unable to parse the response string as a JSON object: " + this.response, ex); } } }