ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/BrwsrCtxImpl.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 29 Aug 2013 14:35:01 +0000
changeset 1253 a936dd8280dc
parent 1249 cdaeea7becf2
child 1254 2e0da2375ef5
permissions -rw-r--r--
WebSocketTest passes OK against modified version of 0.5 net.java.html APIs - rev. b04268c0ded9
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
     4  *
     5  * This program is free software: you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation, version 2 of the License.
     8  *
     9  * This program is distributed in the hope that it will be useful,
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12  * GNU General Public License for more details.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 package org.apidesign.bck2brwsr.ko2brwsr;
    19 
    20 import java.io.ByteArrayOutputStream;
    21 import java.io.IOException;
    22 import java.io.InputStream;
    23 import java.io.InputStreamReader;
    24 import org.apidesign.html.json.spi.FunctionBinding;
    25 import org.apidesign.html.json.spi.JSONCall;
    26 import org.apidesign.html.json.spi.PropertyBinding;
    27 import org.apidesign.html.json.spi.Technology;
    28 import org.apidesign.html.json.spi.Transfer;
    29 import org.apidesign.html.json.spi.WSTransfer;
    30 
    31 /**
    32  *
    33  * @author Jaroslav Tulach <jtulach@netbeans.org>
    34  */
    35 final class BrwsrCtxImpl implements Technology<Object>, Transfer, WSTransfer<LoadWS> {
    36     private BrwsrCtxImpl() {}
    37     
    38     public static final BrwsrCtxImpl DEFAULT = new BrwsrCtxImpl();
    39     
    40     @Override
    41     public void extract(Object obj, String[] props, Object[] values) {
    42         ConvertTypes.extractJSON(obj, props, values);
    43     }
    44 
    45     @Override
    46     public void loadJSON(final JSONCall call) {
    47         class R implements Runnable {
    48             Object[] arr = { null };
    49             @Override
    50             public void run() {
    51                 call.notifySuccess(arr[0]);
    52             }
    53         }
    54         R r = new R();
    55         if (call.isJSONP()) {
    56             String me = ConvertTypes.createJSONP(r.arr, r);
    57             ConvertTypes.loadJSONP(call.composeURL(me), me);
    58         } else {
    59             String data = null;
    60             if (call.isDoOutput()) {
    61                 try {
    62                     ByteArrayOutputStream bos = new ByteArrayOutputStream();
    63                     call.writeData(bos);
    64                     data = new String(bos.toByteArray(), "UTF-8");
    65                 } catch (IOException ex) {
    66                     call.notifyError(ex);
    67                 }
    68             }
    69             ConvertTypes.loadJSON(call.composeURL(null), r.arr, r, call.getMethod(), data);
    70         }
    71     }
    72 
    73     @Override
    74     public Object wrapModel(Object model) {
    75         return model;
    76     }
    77 
    78     @Override
    79     public void bind(PropertyBinding b, Object model, Object data) {
    80         Knockout.bind(data, b, b.getPropertyName(), 
    81             "getValue__Ljava_lang_Object_2", 
    82             b.isReadOnly() ? null : "setValue__VLjava_lang_Object_2", 
    83             false, false
    84         );
    85     }
    86 
    87     @Override
    88     public void valueHasMutated(Object data, String propertyName) {
    89         Knockout.valueHasMutated(data, propertyName);
    90     }
    91 
    92     @Override
    93     public void expose(FunctionBinding fb, Object model, Object d) {
    94         Knockout.expose(d, fb, fb.getFunctionName(), "call__VLjava_lang_Object_2Ljava_lang_Object_2");
    95     }
    96 
    97     @Override
    98     public void applyBindings(Object data) {
    99         Knockout.applyBindings(data);
   100     }
   101 
   102     @Override
   103     public Object wrapArray(Object[] arr) {
   104         return arr;
   105     }
   106 
   107     @Override
   108     public <M> M toModel(Class<M> modelClass, Object data) {
   109         return modelClass.cast(data);
   110     }
   111 
   112     @Override
   113     public Object toJSON(InputStream is) throws IOException {
   114         StringBuilder sb = new StringBuilder();
   115         InputStreamReader r = new InputStreamReader(is);
   116         for (;;) {
   117             int ch = r.read();
   118             if (ch == -1) {
   119                 break;
   120             }
   121             sb.append((char)ch);
   122         }
   123         return ConvertTypes.parse(sb.toString());
   124     }
   125 
   126     @Override
   127     public void runSafe(Runnable r) {
   128         r.run();
   129     }
   130 
   131     @Override
   132     public LoadWS open(String url, JSONCall callback) {
   133         return new LoadWS(callback, url);
   134     }
   135 
   136     @Override
   137     public void send(LoadWS socket, JSONCall data) {
   138         socket.send(data);
   139     }
   140 
   141     @Override
   142     public void close(LoadWS socket) {
   143         socket.close();
   144     }
   145 }