/* * File JSONParserException.java * * Copyright (C) 2010 Remco Bouckaert remco@cs.auckland.ac.nz * * This file is part of BEAST2. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package beast.util; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; /** * Exception thrown by JSONParser * that keeps track of the JSONOBject that caused the anomaly. */ public class JSONParserException extends XMLParserException { private static final long serialVersionUID = 1L; /** * JSONObject where the anomaly was in the vicinity * */ JSONObject node; /** * short description of the anomaly * */ String m_sMsg; /** * number of the anomaly, for ease of finding in the code * */ int m_nErrorNr; public JSONParserException(JSONObject node, String msg, int errorNr) { super(msg); this.node = node; m_sMsg = ""; m_nErrorNr = errorNr; } // format message and resolve parent @Override public String getMessage() { String msg = "\nError " + m_nErrorNr + " parsing the json input file\n\n" + m_sMsg + super.getOriginalMessage(); if (node == null) { return "NULL NODE\n" + msg; } String path = ""; Object o = this.node; while (o != null) { if (o instanceof JSONObject) { JSONObject node = (JSONObject) o; String ID; ID = getAttribute(node, "id"); if (ID != null) { ID = " id: \"" + ID + "\""; } else { ID = ""; } String name = ""; Object p = node.getParent(); if (p instanceof JSONObject) { JSONObject parent = (JSONObject) p; for (String key : parent.keySet()) { try { if (parent.get(key).equals(o)) { name = "\"" + key + "\": "; } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } String spec; spec = getAttribute(node, "spec"); if (spec != null) { spec = " spec: \"" + spec + "\""; } else { spec = ""; } path = path.replaceAll(" \"", " \""); path = path.replaceAll(" \\{", " \\{"); path = path.replaceAll(" \\[", " ["); path = path.replaceAll(" \\]", " ]"); path = path.replaceAll(" \\}", " \\}"); path = " " + name + "{" + ID + spec + "\n" + path + " }\n"; o = node.getParent(); } else if (o instanceof JSONArray) { JSONArray list = (JSONArray) o; Object p = list.getParent(); String name = ""; if (p instanceof JSONObject) { JSONObject parent = (JSONObject) p; for (String key : parent.keySet()) { try { if (parent.get(key).equals(o)) { name = "\"" + key + "\": "; } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } path = path.replaceAll(" \"", " \""); path = path.replaceAll(" \\{", " \\{"); path = path.replaceAll(" \\[", " ["); path = path.replaceAll(" \\]", " ]"); path = path.replaceAll(" \\}", " \\}"); path = " " + name + "[\n" + path + " ]\n"; o = list.getParent(); } } msg += "\n\nError detected about here:\n" + path; return msg; } // getMessage String getAttribute(JSONObject node, String target) { if (node.has(target)) { try { return node.get(target).toString(); } catch (JSONException e) { return null; } } return null; } // getAttribute } // JSONParserException