blob: 91d21d70be1ddf9ea4ddc1da437be4cec32c933c [file] [log] [blame]
/*
* 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>
* <p>
* 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;
}
}