jaroslav@1189: /** jaroslav@1189: * HTML via Java(tm) Language Bindings jaroslav@1189: * Copyright (C) 2013 Jaroslav Tulach jaroslav@1189: * jaroslav@1189: * This program is free software: you can redistribute it and/or modify jaroslav@1189: * it under the terms of the GNU General Public License as published by jaroslav@1189: * the Free Software Foundation, version 2 of the License. jaroslav@1189: * jaroslav@1189: * This program is distributed in the hope that it will be useful, jaroslav@1189: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1189: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1189: * GNU General Public License for more details. apidesign.org jaroslav@1189: * designates this particular file as subject to the jaroslav@1189: * "Classpath" exception as provided by apidesign.org jaroslav@1189: * in the License file that accompanied this code. jaroslav@1189: * jaroslav@1189: * You should have received a copy of the GNU General Public License jaroslav@1189: * along with this program. Look for COPYING file in the top folder. jaroslav@1189: * If not, see http://wiki.apidesign.org/wiki/GPLwithClassPathException jaroslav@1189: */ jaroslav@1189: package org.apidesign.html.ko2brwsr; jaroslav@1189: jaroslav@1199: import java.io.ByteArrayOutputStream; jaroslav@1196: import java.io.IOException; jaroslav@1196: import java.io.InputStream; jaroslav@1196: import java.io.InputStreamReader; jaroslav@1220: import net.java.html.BrwsrCtx; jaroslav@1220: import org.apidesign.html.context.spi.Contexts; jaroslav@1189: import org.apidesign.html.json.spi.FunctionBinding; jaroslav@1189: import org.apidesign.html.json.spi.JSONCall; jaroslav@1189: import org.apidesign.html.json.spi.PropertyBinding; jaroslav@1189: import org.apidesign.html.json.spi.Technology; jaroslav@1189: import org.apidesign.html.json.spi.Transfer; jaroslav@1189: jaroslav@1189: /** jaroslav@1189: * jaroslav@1189: * @author Jaroslav Tulach jaroslav@1189: */ jaroslav@1220: final class BrwsrCtxImpl implements Technology, Transfer { jaroslav@1220: private BrwsrCtxImpl() {} jaroslav@1189: jaroslav@1220: public static final BrwsrCtxImpl DEFAULT = new BrwsrCtxImpl(); jaroslav@1189: jaroslav@1189: @Override jaroslav@1189: public void extract(Object obj, String[] props, Object[] values) { jaroslav@1189: ConvertTypes.extractJSON(obj, props, values); jaroslav@1189: } jaroslav@1189: jaroslav@1189: @Override jaroslav@1189: public void loadJSON(final JSONCall call) { jaroslav@1189: class R implements Runnable { jaroslav@1189: Object[] arr = { null }; jaroslav@1189: @Override jaroslav@1189: public void run() { jaroslav@1189: call.notifySuccess(arr[0]); jaroslav@1189: } jaroslav@1189: } jaroslav@1189: R r = new R(); jaroslav@1189: if (call.isJSONP()) { jaroslav@1189: String me = ConvertTypes.createJSONP(r.arr, r); jaroslav@1199: ConvertTypes.loadJSONP(call.composeURL(me), me); jaroslav@1189: } else { jaroslav@1199: String data = null; jaroslav@1199: if (call.isDoOutput()) { jaroslav@1199: try { jaroslav@1199: ByteArrayOutputStream bos = new ByteArrayOutputStream(); jaroslav@1199: call.writeData(bos); jaroslav@1199: data = new String(bos.toByteArray(), "UTF-8"); jaroslav@1199: } catch (IOException ex) { jaroslav@1199: call.notifyError(ex); jaroslav@1199: } jaroslav@1199: } jaroslav@1199: ConvertTypes.loadJSON(call.composeURL(null), r.arr, r, call.getMethod(), data); jaroslav@1189: } jaroslav@1189: } jaroslav@1189: jaroslav@1189: @Override jaroslav@1189: public Object wrapModel(Object model) { jaroslav@1189: return model; jaroslav@1189: } jaroslav@1189: jaroslav@1189: @Override jaroslav@1189: public void bind(PropertyBinding b, Object model, Object data) { jaroslav@1189: Knockout.bind(data, b, b.getPropertyName(), jaroslav@1189: "getValue__Ljava_lang_Object_2", jaroslav@1189: b.isReadOnly() ? null : "setValue__VLjava_lang_Object_2", jaroslav@1189: false, false jaroslav@1189: ); jaroslav@1189: } jaroslav@1189: jaroslav@1189: @Override jaroslav@1189: public void valueHasMutated(Object data, String propertyName) { jaroslav@1189: Knockout.valueHasMutated(data, propertyName); jaroslav@1189: } jaroslav@1189: jaroslav@1189: @Override jaroslav@1189: public void expose(FunctionBinding fb, Object model, Object d) { jaroslav@1189: Knockout.expose(d, fb, fb.getFunctionName(), "call__VLjava_lang_Object_2Ljava_lang_Object_2"); jaroslav@1189: } jaroslav@1189: jaroslav@1189: @Override jaroslav@1189: public void applyBindings(Object data) { jaroslav@1189: Knockout.applyBindings(data); jaroslav@1189: } jaroslav@1189: jaroslav@1189: @Override jaroslav@1189: public Object wrapArray(Object[] arr) { jaroslav@1189: return arr; jaroslav@1189: } jaroslav@1189: jaroslav@1189: @Override jaroslav@1189: public M toModel(Class modelClass, Object data) { jaroslav@1189: return modelClass.cast(data); jaroslav@1189: } jaroslav@1196: jaroslav@1196: @Override jaroslav@1196: public Object toJSON(InputStream is) throws IOException { jaroslav@1196: StringBuilder sb = new StringBuilder(); jaroslav@1196: InputStreamReader r = new InputStreamReader(is); jaroslav@1196: for (;;) { jaroslav@1196: int ch = r.read(); jaroslav@1196: if (ch == -1) { jaroslav@1196: break; jaroslav@1196: } jaroslav@1196: sb.append((char)ch); jaroslav@1196: } jaroslav@1196: return ConvertTypes.parse(sb.toString()); jaroslav@1196: } jaroslav@1189: }