ko4j/src/main/java/org/netbeans/html/ko4j/LoadWS.java
author Jaroslav Tulach <jtulach@netbeans.org>
Tue, 26 Aug 2014 18:13:30 +0200
changeset 838 bdc3d696dd4a
parent 790 30f20d9c0986
permissions -rw-r--r--
During the API review process (bug 246133) the reviewers decided that in order to include html4j to NetBeans Platform, we need to stop using org.apidesign namespace and switch to NetBeans one. Repackaging all SPI packages into org.netbeans.html.smthng.spi.
jaroslav@247
     1
/**
jaroslav@358
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
jaroslav@247
     3
 *
jaroslav@551
     4
 * Copyright 2013-2014 Oracle and/or its affiliates. All rights reserved.
jaroslav@247
     5
 *
jaroslav@358
     6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
jaroslav@358
     7
 * Other names may be trademarks of their respective owners.
jaroslav@247
     8
 *
jaroslav@358
     9
 * The contents of this file are subject to the terms of either the GNU
jaroslav@358
    10
 * General Public License Version 2 only ("GPL") or the Common
jaroslav@358
    11
 * Development and Distribution License("CDDL") (collectively, the
jaroslav@358
    12
 * "License"). You may not use this file except in compliance with the
jaroslav@358
    13
 * License. You can obtain a copy of the License at
jaroslav@358
    14
 * http://www.netbeans.org/cddl-gplv2.html
jaroslav@358
    15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
jaroslav@358
    16
 * specific language governing permissions and limitations under the
jaroslav@358
    17
 * License.  When distributing the software, include this License Header
jaroslav@358
    18
 * Notice in each file and include the License file at
jaroslav@358
    19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
jaroslav@358
    20
 * particular file as subject to the "Classpath" exception as provided
jaroslav@358
    21
 * by Oracle in the GPL Version 2 section of the License file that
jaroslav@358
    22
 * accompanied this code. If applicable, add the following below the
jaroslav@358
    23
 * License Header, with the fields enclosed by brackets [] replaced by
jaroslav@358
    24
 * your own identifying information:
jaroslav@358
    25
 * "Portions Copyrighted [year] [name of copyright owner]"
jaroslav@358
    26
 *
jaroslav@358
    27
 * Contributor(s):
jaroslav@358
    28
 *
jaroslav@358
    29
 * The Original Software is NetBeans. The Initial Developer of the Original
jaroslav@551
    30
 * Software is Oracle. Portions Copyright 2013-2014 Oracle. All Rights Reserved.
jaroslav@358
    31
 *
jaroslav@358
    32
 * If you wish your version of this file to be governed by only the CDDL
jaroslav@358
    33
 * or only the GPL Version 2, indicate your decision by adding
jaroslav@358
    34
 * "[Contributor] elects to include this software in this distribution
jaroslav@358
    35
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
jaroslav@358
    36
 * single choice of license, a recipient has the option to distribute
jaroslav@358
    37
 * your version of this file under either the CDDL, the GPL Version 2 or
jaroslav@358
    38
 * to extend the choice of license to its licensees as provided above.
jaroslav@358
    39
 * However, if you add GPL Version 2 code and therefore, elected the GPL
jaroslav@358
    40
 * Version 2 license, then the option applies only if the new code is
jaroslav@358
    41
 * made subject to such option by the copyright holder.
jaroslav@247
    42
 */
jaroslav@442
    43
package org.netbeans.html.ko4j;
jaroslav@247
    44
jaroslav@247
    45
import net.java.html.js.JavaScriptBody;
jtulach@838
    46
import org.netbeans.html.json.spi.JSONCall;
jaroslav@247
    47
jaroslav@446
    48
/** Communication with WebSockets via browser's WebSocket object.
jaroslav@247
    49
 *
jtulach@790
    50
 * @author Jaroslav Tulach
jaroslav@247
    51
 */
jaroslav@247
    52
final class LoadWS {
jaroslav@247
    53
    private final Object ws;
jaroslav@247
    54
    private final JSONCall call;
jaroslav@258
    55
    LoadWS(JSONCall first, String url) {
jaroslav@247
    56
        call = first;
jaroslav@247
    57
        ws = initWebSocket(this, url);
jaroslav@258
    58
        if (ws == null) {
jaroslav@258
    59
            first.notifyError(new IllegalArgumentException("Wrong URL: " + url));
jaroslav@250
    60
        }
jaroslav@247
    61
    }
jaroslav@247
    62
    
jaroslav@258
    63
    void send(JSONCall call) {
jaroslav@258
    64
        push(call);
jaroslav@258
    65
    }
jaroslav@258
    66
    
jaroslav@247
    67
    private synchronized void push(JSONCall call) {
jaroslav@258
    68
        send(ws, call.getMessage());
jaroslav@247
    69
    }
jaroslav@247
    70
jaroslav@250
    71
    void onOpen(Object ev) {
jaroslav@250
    72
        if (!call.isDoOutput()) {
jaroslav@250
    73
            call.notifySuccess(null);
jaroslav@250
    74
        }
jaroslav@247
    75
    }
jaroslav@247
    76
    
jaroslav@446
    77
    
jaroslav@446
    78
    @JavaScriptBody(args = { "data" }, body = "try {\n"
jaroslav@446
    79
        + "    return eval('(' + data + ')');\n"
jaroslav@446
    80
        + "  } catch (error) {;\n"
jaroslav@446
    81
        + "    return data;\n"
jaroslav@446
    82
        + "  }\n"
jaroslav@446
    83
    )
jaroslav@446
    84
    private static native Object toJSON(String data);
jaroslav@446
    85
    
jaroslav@247
    86
    void onMessage(Object ev, String data) {
jaroslav@446
    87
        Object json = toJSON(data);
jaroslav@247
    88
        call.notifySuccess(json);
jaroslav@247
    89
    }
jaroslav@247
    90
    
jaroslav@247
    91
    void onError(Object ev) {
jaroslav@247
    92
        call.notifyError(new Exception(ev.toString()));
jaroslav@247
    93
    }
jaroslav@247
    94
jaroslav@250
    95
    void onClose(boolean wasClean, int code, String reason) {
jaroslav@250
    96
        call.notifyError(null);
jaroslav@250
    97
    }
jaroslav@258
    98
    
jaroslav@247
    99
    @JavaScriptBody(args = { "back", "url" }, javacall = true, body = ""
jaroslav@446
   100
        + "if (window.WebSocket) {\n"
jaroslav@446
   101
        + "  try {\n"
jaroslav@446
   102
        + "    var ws = new window.WebSocket(url);\n"
jaroslav@446
   103
        + "    ws.onopen = function(ev) {\n"
jaroslav@446
   104
        + "      back.@org.netbeans.html.ko4j.LoadWS::onOpen(Ljava/lang/Object;)(ev);\n"
jaroslav@446
   105
        + "    };\n"
jaroslav@446
   106
        + "    ws.onmessage = function(ev) {\n"
jaroslav@446
   107
        + "      back.@org.netbeans.html.ko4j.LoadWS::onMessage(Ljava/lang/Object;Ljava/lang/String;)(ev, ev.data);\n"
jaroslav@446
   108
        + "    };\n"
jaroslav@446
   109
        + "    ws.onerror = function(ev) {\n"
jaroslav@446
   110
        + "      back.@org.netbeans.html.ko4j.LoadWS::onError(Ljava/lang/Object;)(ev);\n"
jaroslav@446
   111
        + "    };\n"
jaroslav@446
   112
        + "    ws.onclose = function(ev) {\n"
jaroslav@446
   113
        + "      back.@org.netbeans.html.ko4j.LoadWS::onClose(ZILjava/lang/String;)(ev.wasClean, ev.code, ev.reason);\n"
jaroslav@446
   114
        + "    };\n"
jaroslav@446
   115
        + "    return ws;\n"
jaroslav@446
   116
        + "  } catch (ex) {\n"
jaroslav@446
   117
        + "    return null;\n"
jaroslav@446
   118
        + "  }\n"
jaroslav@446
   119
        + "} else {\n"
jaroslav@446
   120
        + "  return null;\n"
jaroslav@446
   121
        + "}\n"
jaroslav@247
   122
    )
jaroslav@247
   123
    private static Object initWebSocket(Object back, String url) {
jaroslav@247
   124
        return null;
jaroslav@247
   125
    }
jaroslav@247
   126
    
jaroslav@247
   127
jaroslav@247
   128
    @JavaScriptBody(args = { "ws", "msg" }, body = ""
jaroslav@247
   129
        + "ws.send(msg);"
jaroslav@247
   130
    )
jaroslav@247
   131
    private void send(Object ws, String msg) {
jaroslav@247
   132
    }
jaroslav@250
   133
jaroslav@250
   134
    @JavaScriptBody(args = { "ws" }, body = "ws.close();")
jaroslav@250
   135
    private static void close(Object ws) {
jaroslav@250
   136
    }
jaroslav@258
   137
jaroslav@258
   138
    void close() {
jaroslav@258
   139
        close(ws);
jaroslav@258
   140
    }
jaroslav@247
   141
}