Search in sources :

Example 1 with RPCError

use of org.dartlang.vm.service.element.RPCError in project intellij-plugins by JetBrains.

the class VmServiceBase method connect.

/**
   * Connect to the VM observatory service via the specified URI
   *
   * @return an API object for interacting with the VM service (not {@code null}).
   */
public static VmService connect(final String url) throws IOException {
    // Validate URL
    URI uri;
    try {
        uri = new URI(url);
    } catch (URISyntaxException e) {
        throw new IOException("Invalid URL: " + url, e);
    }
    String wsScheme = uri.getScheme();
    if (!"ws".equals(wsScheme) && !"wss".equals(wsScheme)) {
        throw new IOException("Unsupported URL scheme: " + wsScheme);
    }
    // Create web socket and observatory
    WebSocket webSocket;
    try {
        webSocket = new WebSocket(uri);
    } catch (WebSocketException e) {
        throw new IOException("Failed to create websocket: " + url, e);
    }
    final VmService vmService = new VmService();
    // Setup event handler for forwarding responses
    webSocket.setEventHandler(new WebSocketEventHandler() {

        @Override
        public void onClose() {
            Logging.getLogger().logInformation("VM connection closed: " + url);
            vmService.connectionClosed();
        }

        @Override
        public void onMessage(WebSocketMessage message) {
            Logging.getLogger().logInformation("VM message: " + message.getText());
            try {
                vmService.processResponse(message.getText());
            } catch (Exception e) {
                Logging.getLogger().logError(e.getMessage(), e);
            }
        }

        @Override
        public void onOpen() {
            vmService.connectionOpened();
            Logging.getLogger().logInformation("VM connection open: " + url);
        }

        @Override
        public void onPing() {
        }

        @Override
        public void onPong() {
        }
    });
    // Establish WebSocket Connection
    try {
        webSocket.connect();
    } catch (WebSocketException e) {
        throw new IOException("Failed to connect: " + url, e);
    }
    vmService.requestSink = new WebSocketRequestSink(webSocket);
    // Check protocol version
    final CountDownLatch latch = new CountDownLatch(1);
    final String[] errMsg = new String[1];
    vmService.getVersion(new VersionConsumer() {

        @Override
        public void onError(RPCError error) {
            String msg = "Failed to determine protocol version: " + error.getCode() + "\n  message: " + error.getMessage() + "\n  details: " + error.getDetails();
            Logging.getLogger().logInformation(msg);
            errMsg[0] = msg;
        }

        @Override
        public void received(Version response) {
            int major = response.getMajor();
            int minor = response.getMinor();
            if (major != VmService.versionMajor || minor != VmService.versionMinor) {
                if (major == 2 || major == 3) {
                    Logging.getLogger().logInformation("Difference in protocol version: client=" + VmService.versionMajor + "." + VmService.versionMinor + " vm=" + major + "." + minor);
                } else {
                    String msg = "Incompatible protocol version: client=" + VmService.versionMajor + "." + VmService.versionMinor + " vm=" + major + "." + minor;
                    Logging.getLogger().logError(msg);
                    errMsg[0] = msg;
                }
            }
            latch.countDown();
        }
    });
    try {
        if (!latch.await(5, TimeUnit.SECONDS)) {
            throw new IOException("Failed to determine protocol version");
        }
        if (errMsg[0] != null) {
            throw new IOException(errMsg[0]);
        }
    } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted while waiting for response", e);
    }
    return vmService;
}
Also used : WebSocketException(de.roderick.weberknecht.WebSocketException) RPCError(org.dartlang.vm.service.element.RPCError) URISyntaxException(java.net.URISyntaxException) IOException(java.io.IOException) WebSocketRequestSink(org.dartlang.vm.service.internal.WebSocketRequestSink) CountDownLatch(java.util.concurrent.CountDownLatch) URI(java.net.URI) WebSocketEventHandler(de.roderick.weberknecht.WebSocketEventHandler) URISyntaxException(java.net.URISyntaxException) WebSocketException(de.roderick.weberknecht.WebSocketException) IOException(java.io.IOException) WebSocket(de.roderick.weberknecht.WebSocket) Version(org.dartlang.vm.service.element.Version) WebSocketMessage(de.roderick.weberknecht.WebSocketMessage)

Example 2 with RPCError

use of org.dartlang.vm.service.element.RPCError in project intellij-plugins by JetBrains.

the class VmServiceBase method processResponse.

/**
   * Process the response from the VM service and forward that response to the consumer associated
   * with the response id.
   */
void processResponse(String jsonText) {
    if (jsonText == null || jsonText.isEmpty()) {
        return;
    }
    // Decode the JSON
    JsonObject json;
    try {
        json = (JsonObject) new JsonParser().parse(jsonText);
    } catch (Exception e) {
        Logging.getLogger().logError("Parse response failed: " + jsonText, e);
        return;
    }
    // Forward events
    JsonElement idElem = json.get(ID);
    if (idElem == null) {
        String method;
        try {
            method = json.get(METHOD).getAsString();
        } catch (Exception e) {
            Logging.getLogger().logError("Event missing " + METHOD, e);
            return;
        }
        if (!"streamNotify".equals(method)) {
            Logging.getLogger().logError("Unknown event " + METHOD + ": " + method);
            return;
        }
        JsonObject params;
        try {
            params = json.get(PARAMS).getAsJsonObject();
        } catch (Exception e) {
            Logging.getLogger().logError("Event missing " + PARAMS, e);
            return;
        }
        String streamId;
        try {
            streamId = params.get(STREAM_ID).getAsString();
        } catch (Exception e) {
            Logging.getLogger().logError("Event missing " + STREAM_ID, e);
            return;
        }
        Event event;
        try {
            event = new Event(params.get(EVENT).getAsJsonObject());
        } catch (Exception e) {
            Logging.getLogger().logError("Event missing " + EVENT, e);
            return;
        }
        forwardEvent(streamId, event);
        return;
    }
    // Get the consumer associated with this response
    String id;
    try {
        id = idElem.getAsString();
    } catch (Exception e) {
        Logging.getLogger().logError("Response missing " + ID, e);
        return;
    }
    Consumer consumer = consumerMap.remove(id);
    if (consumer == null) {
        Logging.getLogger().logError("No consumer associated with " + ID + ": " + id);
        return;
    }
    // Forward the response if the request was successfully executed
    JsonElement resultElem = json.get(RESULT);
    if (resultElem != null) {
        JsonObject result;
        try {
            result = resultElem.getAsJsonObject();
        } catch (Exception e) {
            Logging.getLogger().logError("Response has invalid " + RESULT, e);
            return;
        }
        String responseType;
        try {
            responseType = result.get(TYPE).getAsString();
        } catch (Exception e) {
            Logging.getLogger().logError("Response missing " + TYPE, e);
            return;
        }
        forwardResponse(consumer, responseType, result);
        return;
    }
    // Forward an error if the request failed
    resultElem = json.get(ERROR);
    if (resultElem != null) {
        JsonObject error;
        try {
            error = resultElem.getAsJsonObject();
        } catch (Exception e) {
            Logging.getLogger().logError("Response has invalid " + RESULT, e);
            return;
        }
        consumer.onError(new RPCError(error));
        return;
    }
    Logging.getLogger().logError("Response missing " + RESULT + " and " + ERROR);
}
Also used : JsonElement(com.google.gson.JsonElement) JsonObject(com.google.gson.JsonObject) Event(org.dartlang.vm.service.element.Event) RPCError(org.dartlang.vm.service.element.RPCError) URISyntaxException(java.net.URISyntaxException) WebSocketException(de.roderick.weberknecht.WebSocketException) IOException(java.io.IOException) JsonParser(com.google.gson.JsonParser)

Aggregations

WebSocketException (de.roderick.weberknecht.WebSocketException)2 IOException (java.io.IOException)2 URISyntaxException (java.net.URISyntaxException)2 RPCError (org.dartlang.vm.service.element.RPCError)2 JsonElement (com.google.gson.JsonElement)1 JsonObject (com.google.gson.JsonObject)1 JsonParser (com.google.gson.JsonParser)1 WebSocket (de.roderick.weberknecht.WebSocket)1 WebSocketEventHandler (de.roderick.weberknecht.WebSocketEventHandler)1 WebSocketMessage (de.roderick.weberknecht.WebSocketMessage)1 URI (java.net.URI)1 CountDownLatch (java.util.concurrent.CountDownLatch)1 Event (org.dartlang.vm.service.element.Event)1 Version (org.dartlang.vm.service.element.Version)1 WebSocketRequestSink (org.dartlang.vm.service.internal.WebSocketRequestSink)1