/* * Copyright (c) 2015, the Dart project authors. * * Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html * * 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.dartlang.vm.service.element; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import org.dartlang.vm.service.internal.VmServiceConst; /** * When an RPC encounters an error, it is provided in the _error_ property of the response object. * JSON-RPC errors always provide _code_, _message_, and _data_ properties. <br/> * Here is an example error response for our [streamListen](#streamlisten) request above. This error * would be generated if we were attempting to subscribe to the _GC_ stream multiple times from the * same client. * * <pre> * { * "jsonrpc": "2.0", * "error": { * "code": 103, * "message": "Stream already subscribed", * "data": { * "details": "The stream 'GC' is already subscribed" * } * } * "id": "2" * } * </pre> * * In addition the the [error codes](http://www.jsonrpc.org/specification#error_object) specified in * the JSON-RPC spec, we use the following application specific error codes: * * <pre> * code | message | meaning * ---- | ------- | ------- * 100 | Feature is disabled | The operation is unable to complete because a feature is disabled * 101 | VM must be paused | This operation is only valid when the VM is paused * 102 | Cannot add breakpoint | The VM is unable to add a breakpoint at the specified line or function * 103 | Stream already subscribed | The client is already subscribed to the specified _streamId_ * 104 | Stream not subscribed | The client is not subscribed to the specified _streamId_ * </pre> */ public class RPCError extends Element implements VmServiceConst { /** * The response code used by the client when it receives a response from the server that it did * not expect. For example, it requested a library element but received a list. */ public static final int UNEXPECTED_RESPONSE = 5; public static RPCError unexpected(String expectedType, Response response) { String errMsg = "Expected type " + expectedType + " but received " + response.getType(); if (response instanceof Sentinel) { errMsg += ": " + ((Sentinel) response).getKind(); } JsonObject json = new JsonObject(); json.addProperty("code", UNEXPECTED_RESPONSE); json.addProperty("message", errMsg); JsonObject data = new JsonObject(); data.addProperty("details", errMsg); data.add("response", response.getJson()); json.add("data", data); return new RPCError(json); } public RPCError(JsonObject json) { super(json); } public int getCode() { return json.get("code").getAsInt(); } public String getDetails() { JsonElement data = json.get("data"); if (data instanceof JsonObject) { JsonElement details = ((JsonObject) data).get("details"); if (details != null) { return details.getAsString(); } } return null; } public String getMessage() { return json.get("message").getAsString(); } public JsonObject getRequest() { JsonElement data = json.get("data"); if (data instanceof JsonObject) { JsonElement request = ((JsonObject) data).get("request"); if (request instanceof JsonObject) { return (JsonObject) request; } } return null; } }