ko/bck2brwsr/src/main/java/org/apidesign/bck2brwsr/ko2brwsr/BrwsrCtxImpl.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Wed, 08 Jan 2014 14:06:21 +0100
branchNbHtml4J
changeset 1420 246ee398b411
parent 1254 2e0da2375ef5
child 1425 43bb0053f3e2
permissions -rw-r--r--
Re-use the shared knockout binding provided by html4j project
jaroslav@1189
     1
/**
jaroslav@1227
     2
 * Back 2 Browser Bytecode Translator
jaroslav@1227
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@1189
     4
 *
jaroslav@1189
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@1189
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@1189
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@1189
     8
 *
jaroslav@1189
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@1189
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@1189
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@1227
    12
 * GNU General Public License for more details.
jaroslav@1189
    13
 *
jaroslav@1189
    14
 * You should have received a copy of the GNU General Public License
jaroslav@1189
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@1227
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@1189
    17
 */
jaroslav@1228
    18
package org.apidesign.bck2brwsr.ko2brwsr;
jaroslav@1189
    19
jaroslav@1199
    20
import java.io.ByteArrayOutputStream;
jaroslav@1196
    21
import java.io.IOException;
jaroslav@1196
    22
import java.io.InputStream;
jaroslav@1196
    23
import java.io.InputStreamReader;
jaroslav@1189
    24
import org.apidesign.html.json.spi.JSONCall;
jaroslav@1189
    25
import org.apidesign.html.json.spi.Transfer;
jaroslav@1253
    26
import org.apidesign.html.json.spi.WSTransfer;
jaroslav@1189
    27
jaroslav@1189
    28
/**
jaroslav@1189
    29
 *
jaroslav@1189
    30
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@1189
    31
 */
jaroslav@1420
    32
final class BrwsrCtxImpl implements Transfer, WSTransfer<LoadWS> {
jaroslav@1220
    33
    private BrwsrCtxImpl() {}
jaroslav@1189
    34
    
jaroslav@1220
    35
    public static final BrwsrCtxImpl DEFAULT = new BrwsrCtxImpl();
jaroslav@1189
    36
    
jaroslav@1189
    37
    @Override
jaroslav@1189
    38
    public void extract(Object obj, String[] props, Object[] values) {
jaroslav@1189
    39
        ConvertTypes.extractJSON(obj, props, values);
jaroslav@1189
    40
    }
jaroslav@1189
    41
jaroslav@1189
    42
    @Override
jaroslav@1189
    43
    public void loadJSON(final JSONCall call) {
jaroslav@1189
    44
        class R implements Runnable {
jaroslav@1254
    45
            final boolean success;
jaroslav@1254
    46
jaroslav@1254
    47
            public R(boolean success) {
jaroslav@1254
    48
                this.success = success;
jaroslav@1254
    49
            }
jaroslav@1254
    50
            
jaroslav@1189
    51
            Object[] arr = { null };
jaroslav@1189
    52
            @Override
jaroslav@1189
    53
            public void run() {
jaroslav@1254
    54
                if (success) {
jaroslav@1254
    55
                    call.notifySuccess(arr[0]);
jaroslav@1254
    56
                } else {
jaroslav@1254
    57
                    Throwable t;
jaroslav@1254
    58
                    if (arr[0] instanceof Throwable) {
jaroslav@1254
    59
                        t = (Throwable) arr[0];
jaroslav@1254
    60
                    } else {
jaroslav@1254
    61
                        if (arr[0] == null) {
jaroslav@1254
    62
                            t = new IOException();
jaroslav@1254
    63
                        } else {
jaroslav@1254
    64
                            t = new IOException(arr[0].toString());
jaroslav@1254
    65
                        }
jaroslav@1254
    66
                    }
jaroslav@1254
    67
                    call.notifyError(t);
jaroslav@1254
    68
                }
jaroslav@1189
    69
            }
jaroslav@1189
    70
        }
jaroslav@1254
    71
        R success = new R(true);
jaroslav@1254
    72
        R failure = new R(false);
jaroslav@1189
    73
        if (call.isJSONP()) {
jaroslav@1254
    74
            String me = ConvertTypes.createJSONP(success.arr, success);
jaroslav@1199
    75
            ConvertTypes.loadJSONP(call.composeURL(me), me);
jaroslav@1189
    76
        } else {
jaroslav@1199
    77
            String data = null;
jaroslav@1199
    78
            if (call.isDoOutput()) {
jaroslav@1199
    79
                try {
jaroslav@1199
    80
                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
jaroslav@1199
    81
                    call.writeData(bos);
jaroslav@1199
    82
                    data = new String(bos.toByteArray(), "UTF-8");
jaroslav@1199
    83
                } catch (IOException ex) {
jaroslav@1199
    84
                    call.notifyError(ex);
jaroslav@1199
    85
                }
jaroslav@1199
    86
            }
jaroslav@1254
    87
            ConvertTypes.loadJSON(call.composeURL(null), success.arr, success, failure, call.getMethod(), data);
jaroslav@1189
    88
        }
jaroslav@1189
    89
    }
jaroslav@1189
    90
jaroslav@1189
    91
    @Override
jaroslav@1196
    92
    public Object toJSON(InputStream is) throws IOException {
jaroslav@1196
    93
        StringBuilder sb = new StringBuilder();
jaroslav@1196
    94
        InputStreamReader r = new InputStreamReader(is);
jaroslav@1196
    95
        for (;;) {
jaroslav@1196
    96
            int ch = r.read();
jaroslav@1196
    97
            if (ch == -1) {
jaroslav@1196
    98
                break;
jaroslav@1196
    99
            }
jaroslav@1196
   100
            sb.append((char)ch);
jaroslav@1196
   101
        }
jaroslav@1196
   102
        return ConvertTypes.parse(sb.toString());
jaroslav@1196
   103
    }
jaroslav@1249
   104
jaroslav@1249
   105
    @Override
jaroslav@1253
   106
    public LoadWS open(String url, JSONCall callback) {
jaroslav@1253
   107
        return new LoadWS(callback, url);
jaroslav@1253
   108
    }
jaroslav@1253
   109
jaroslav@1253
   110
    @Override
jaroslav@1253
   111
    public void send(LoadWS socket, JSONCall data) {
jaroslav@1253
   112
        socket.send(data);
jaroslav@1253
   113
    }
jaroslav@1253
   114
jaroslav@1253
   115
    @Override
jaroslav@1253
   116
    public void close(LoadWS socket) {
jaroslav@1253
   117
        socket.close();
jaroslav@1253
   118
    }
jaroslav@1189
   119
}