ko-bck2brwsr/src/main/java/org/apidesign/html/ko2brwsr/BrwsrCntxt.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 09 May 2013 21:49:33 +0200
changeset 1199 15f9f43bdf5b
parent 1196 fb83f58ece66
permissions -rw-r--r--
Support other methods for XHR as well
     1 /**
     2  * HTML via Java(tm) Language Bindings
     3  * Copyright (C) 2013 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. apidesign.org
    13  * designates this particular file as subject to the
    14  * "Classpath" exception as provided by apidesign.org
    15  * in the License file that accompanied this code.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with this program. Look for COPYING file in the top folder.
    19  * If not, see http://wiki.apidesign.org/wiki/GPLwithClassPathException
    20  */
    21 package org.apidesign.html.ko2brwsr;
    22 
    23 import java.io.ByteArrayOutputStream;
    24 import java.io.IOException;
    25 import java.io.InputStream;
    26 import java.io.InputStreamReader;
    27 import java.util.logging.Level;
    28 import java.util.logging.Logger;
    29 import net.java.html.json.Context;
    30 import org.apidesign.html.json.spi.ContextBuilder;
    31 import org.apidesign.html.json.spi.FunctionBinding;
    32 import org.apidesign.html.json.spi.JSONCall;
    33 import org.apidesign.html.json.spi.PropertyBinding;
    34 import org.apidesign.html.json.spi.Technology;
    35 import org.apidesign.html.json.spi.Transfer;
    36 
    37 /**
    38  *
    39  * @author Jaroslav Tulach <jtulach@netbeans.org>
    40  */
    41 final class BrwsrCntxt implements Technology<Object>, Transfer {
    42     private BrwsrCntxt() {}
    43     
    44     public static final Context DEFAULT;
    45     static {
    46         BrwsrCntxt c = new BrwsrCntxt();
    47         DEFAULT = ContextBuilder.create().withTechnology(c).withTransfer(c).build();
    48     }
    49     
    50     @Override
    51     public void extract(Object obj, String[] props, Object[] values) {
    52         ConvertTypes.extractJSON(obj, props, values);
    53     }
    54 
    55     @Override
    56     public void loadJSON(final JSONCall call) {
    57         class R implements Runnable {
    58             Object[] arr = { null };
    59             @Override
    60             public void run() {
    61                 call.notifySuccess(arr[0]);
    62             }
    63         }
    64         R r = new R();
    65         if (call.isJSONP()) {
    66             String me = ConvertTypes.createJSONP(r.arr, r);
    67             ConvertTypes.loadJSONP(call.composeURL(me), me);
    68         } else {
    69             String data = null;
    70             if (call.isDoOutput()) {
    71                 try {
    72                     ByteArrayOutputStream bos = new ByteArrayOutputStream();
    73                     call.writeData(bos);
    74                     data = new String(bos.toByteArray(), "UTF-8");
    75                 } catch (IOException ex) {
    76                     call.notifyError(ex);
    77                 }
    78             }
    79             ConvertTypes.loadJSON(call.composeURL(null), r.arr, r, call.getMethod(), data);
    80         }
    81     }
    82 
    83     @Override
    84     public Object wrapModel(Object model) {
    85         return model;
    86     }
    87 
    88     @Override
    89     public void bind(PropertyBinding b, Object model, Object data) {
    90         Knockout.bind(data, b, b.getPropertyName(), 
    91             "getValue__Ljava_lang_Object_2", 
    92             b.isReadOnly() ? null : "setValue__VLjava_lang_Object_2", 
    93             false, false
    94         );
    95     }
    96 
    97     @Override
    98     public void valueHasMutated(Object data, String propertyName) {
    99         Knockout.valueHasMutated(data, propertyName);
   100     }
   101 
   102     @Override
   103     public void expose(FunctionBinding fb, Object model, Object d) {
   104         Knockout.expose(d, fb, fb.getFunctionName(), "call__VLjava_lang_Object_2Ljava_lang_Object_2");
   105     }
   106 
   107     @Override
   108     public void applyBindings(Object data) {
   109         Knockout.applyBindings(data);
   110     }
   111 
   112     @Override
   113     public Object wrapArray(Object[] arr) {
   114         return arr;
   115     }
   116 
   117     @Override
   118     public <M> M toModel(Class<M> modelClass, Object data) {
   119         return modelClass.cast(data);
   120     }
   121 
   122     @Override
   123     public Object toJSON(InputStream is) throws IOException {
   124         StringBuilder sb = new StringBuilder();
   125         InputStreamReader r = new InputStreamReader(is);
   126         for (;;) {
   127             int ch = r.read();
   128             if (ch == -1) {
   129                 break;
   130             }
   131             sb.append((char)ch);
   132         }
   133         return ConvertTypes.parse(sb.toString());
   134     }
   135 }