/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.react.devsupport; import javax.annotation.Nullable; import java.io.IOException; import android.text.TextUtils; import com.facebook.common.logging.FLog; import com.facebook.react.common.ReactConstants; import org.json.JSONException; import org.json.JSONObject; /** * The debug server returns errors as json objects. This exception represents that error. */ public class DebugServerException extends IOException { public final String description; public final String fileName; public final int lineNumber; public final int column; private DebugServerException(String description, String fileName, int lineNumber, int column) { this.description = description; this.fileName = fileName; this.lineNumber = lineNumber; this.column = column; } public String toReadableMessage() { return description + "\n at " + fileName + ":" + lineNumber + ":" + column; } /** * Parse a DebugServerException from the server json string. * @param str json string returned by the debug server * @return A DebugServerException or null if the string is not of proper form. */ @Nullable public static DebugServerException parse(String str) { if (TextUtils.isEmpty(str)) { return null; } try { JSONObject jsonObject = new JSONObject(str); String fullFileName = jsonObject.getString("filename"); return new DebugServerException( jsonObject.getString("description"), shortenFileName(fullFileName), jsonObject.getInt("lineNumber"), jsonObject.getInt("column")); } catch (JSONException e) { // I'm not sure how strict this format is for returned errors, or what other errors there can // be, so this may end up being spammy. Can remove it later if necessary. FLog.w(ReactConstants.TAG, "Could not parse DebugServerException from: " + str, e); return null; } } private static String shortenFileName(String fullFileName) { String[] parts = fullFileName.split("/"); return parts[parts.length - 1]; } }