ko/bck2brwsr/src/main/java/org/apidesign/html/ko2brwsr/BrwsrCtxImpl.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 26 Jun 2013 18:44:21 +0200
branchclassloader
changeset 1227 5a907f38608d
parent 1225 73c0973e8e0a
permissions -rw-r--r--
Successfully compiles the new support for knockout
     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.html.ko2brwsr;
    19 
    20 import java.io.ByteArrayOutputStream;
    21 import java.io.IOException;
    22 import java.io.InputStream;
    23 import java.io.InputStreamReader;
    24 import net.java.html.BrwsrCtx;
    25 import org.apidesign.html.context.spi.Contexts;
    26 import org.apidesign.html.json.spi.FunctionBinding;
    27 import org.apidesign.html.json.spi.JSONCall;
    28 import org.apidesign.html.json.spi.PropertyBinding;
    29 import org.apidesign.html.json.spi.Technology;
    30 import org.apidesign.html.json.spi.Transfer;
    31 
    32 /**
    33  *
    34  * @author Jaroslav Tulach <jtulach@netbeans.org>
    35  */
    36 final class BrwsrCtxImpl implements Technology<Object>, Transfer {
    37     private BrwsrCtxImpl() {}
    38     
    39     public static final BrwsrCtxImpl DEFAULT = new BrwsrCtxImpl();
    40     
    41     @Override
    42     public void extract(Object obj, String[] props, Object[] values) {
    43         ConvertTypes.extractJSON(obj, props, values);
    44     }
    45 
    46     @Override
    47     public void loadJSON(final JSONCall call) {
    48         class R implements Runnable {
    49             Object[] arr = { null };
    50             @Override
    51             public void run() {
    52                 call.notifySuccess(arr[0]);
    53             }
    54         }
    55         R r = new R();
    56         if (call.isJSONP()) {
    57             String me = ConvertTypes.createJSONP(r.arr, r);
    58             ConvertTypes.loadJSONP(call.composeURL(me), me);
    59         } else {
    60             String data = null;
    61             if (call.isDoOutput()) {
    62                 try {
    63                     ByteArrayOutputStream bos = new ByteArrayOutputStream();
    64                     call.writeData(bos);
    65                     data = new String(bos.toByteArray(), "UTF-8");
    66                 } catch (IOException ex) {
    67                     call.notifyError(ex);
    68                 }
    69             }
    70             ConvertTypes.loadJSON(call.composeURL(null), r.arr, r, call.getMethod(), data);
    71         }
    72     }
    73 
    74     @Override
    75     public Object wrapModel(Object model) {
    76         return model;
    77     }
    78 
    79     @Override
    80     public void bind(PropertyBinding b, Object model, Object data) {
    81         Knockout.bind(data, b, b.getPropertyName(), 
    82             "getValue__Ljava_lang_Object_2", 
    83             b.isReadOnly() ? null : "setValue__VLjava_lang_Object_2", 
    84             false, false
    85         );
    86     }
    87 
    88     @Override
    89     public void valueHasMutated(Object data, String propertyName) {
    90         Knockout.valueHasMutated(data, propertyName);
    91     }
    92 
    93     @Override
    94     public void expose(FunctionBinding fb, Object model, Object d) {
    95         Knockout.expose(d, fb, fb.getFunctionName(), "call__VLjava_lang_Object_2Ljava_lang_Object_2");
    96     }
    97 
    98     @Override
    99     public void applyBindings(Object data) {
   100         Knockout.applyBindings(data);
   101     }
   102 
   103     @Override
   104     public Object wrapArray(Object[] arr) {
   105         return arr;
   106     }
   107 
   108     @Override
   109     public <M> M toModel(Class<M> modelClass, Object data) {
   110         return modelClass.cast(data);
   111     }
   112 
   113     @Override
   114     public Object toJSON(InputStream is) throws IOException {
   115         StringBuilder sb = new StringBuilder();
   116         InputStreamReader r = new InputStreamReader(is);
   117         for (;;) {
   118             int ch = r.read();
   119             if (ch == -1) {
   120                 break;
   121             }
   122             sb.append((char)ch);
   123         }
   124         return ConvertTypes.parse(sb.toString());
   125     }
   126 }