ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/BrwsrCtxImpl.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 29 Aug 2013 16:24:04 +0000
changeset 1254 2e0da2375ef5
parent 1253 a936dd8280dc
child 1420 246ee398b411
permissions -rw-r--r--
Passes json-tck tests with rev. 09aaf52b71c5 of net.java.html APIs
     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             final boolean success;
    49 
    50             public R(boolean success) {
    51                 this.success = success;
    52             }
    53             
    54             Object[] arr = { null };
    55             @Override
    56             public void run() {
    57                 if (success) {
    58                     call.notifySuccess(arr[0]);
    59                 } else {
    60                     Throwable t;
    61                     if (arr[0] instanceof Throwable) {
    62                         t = (Throwable) arr[0];
    63                     } else {
    64                         if (arr[0] == null) {
    65                             t = new IOException();
    66                         } else {
    67                             t = new IOException(arr[0].toString());
    68                         }
    69                     }
    70                     call.notifyError(t);
    71                 }
    72             }
    73         }
    74         R success = new R(true);
    75         R failure = new R(false);
    76         if (call.isJSONP()) {
    77             String me = ConvertTypes.createJSONP(success.arr, success);
    78             ConvertTypes.loadJSONP(call.composeURL(me), me);
    79         } else {
    80             String data = null;
    81             if (call.isDoOutput()) {
    82                 try {
    83                     ByteArrayOutputStream bos = new ByteArrayOutputStream();
    84                     call.writeData(bos);
    85                     data = new String(bos.toByteArray(), "UTF-8");
    86                 } catch (IOException ex) {
    87                     call.notifyError(ex);
    88                 }
    89             }
    90             ConvertTypes.loadJSON(call.composeURL(null), success.arr, success, failure, call.getMethod(), data);
    91         }
    92     }
    93 
    94     @Override
    95     public Object wrapModel(Object model) {
    96         return model;
    97     }
    98 
    99     @Override
   100     public void bind(PropertyBinding b, Object model, Object data) {
   101         Knockout.bind(data, b, b.getPropertyName(), 
   102             "getValue__Ljava_lang_Object_2", 
   103             b.isReadOnly() ? null : "setValue__VLjava_lang_Object_2", 
   104             false, false
   105         );
   106     }
   107 
   108     @Override
   109     public void valueHasMutated(Object data, String propertyName) {
   110         Knockout.valueHasMutated(data, propertyName);
   111     }
   112 
   113     @Override
   114     public void expose(FunctionBinding fb, Object model, Object d) {
   115         Knockout.expose(d, fb, fb.getFunctionName(), "call__VLjava_lang_Object_2Ljava_lang_Object_2");
   116     }
   117 
   118     @Override
   119     public void applyBindings(Object data) {
   120         Knockout.applyBindings(data);
   121     }
   122 
   123     @Override
   124     public Object wrapArray(Object[] arr) {
   125         return arr;
   126     }
   127 
   128     @Override
   129     public <M> M toModel(Class<M> modelClass, Object data) {
   130         return modelClass.cast(data);
   131     }
   132 
   133     @Override
   134     public Object toJSON(InputStream is) throws IOException {
   135         StringBuilder sb = new StringBuilder();
   136         InputStreamReader r = new InputStreamReader(is);
   137         for (;;) {
   138             int ch = r.read();
   139             if (ch == -1) {
   140                 break;
   141             }
   142             sb.append((char)ch);
   143         }
   144         return ConvertTypes.parse(sb.toString());
   145     }
   146 
   147     @Override
   148     public void runSafe(Runnable r) {
   149         r.run();
   150     }
   151 
   152     @Override
   153     public LoadWS open(String url, JSONCall callback) {
   154         return new LoadWS(callback, url);
   155     }
   156 
   157     @Override
   158     public void send(LoadWS socket, JSONCall data) {
   159         socket.send(data);
   160     }
   161 
   162     @Override
   163     public void close(LoadWS socket) {
   164         socket.close();
   165     }
   166 }