jaroslav@1799: /** jaroslav@1799: * Back 2 Browser Bytecode Translator jaroslav@1799: * Copyright (C) 2012-2015 Jaroslav Tulach jaroslav@1799: * jaroslav@1799: * This program is free software: you can redistribute it and/or modify jaroslav@1799: * it under the terms of the GNU General Public License as published by jaroslav@1799: * the Free Software Foundation, version 2 of the License. jaroslav@1799: * jaroslav@1799: * This program is distributed in the hope that it will be useful, jaroslav@1799: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1799: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1799: * GNU General Public License for more details. jaroslav@1799: * jaroslav@1799: * You should have received a copy of the GNU General Public License jaroslav@1799: * along with this program. Look for COPYING file in the top folder. jaroslav@1799: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1799: */ jaroslav@1799: package org.apidesign.bck2brwsr.ko2brwsr; jaroslav@1799: jaroslav@1799: import java.io.IOException; jaroslav@1799: import java.net.URI; jaroslav@1799: import java.net.URISyntaxException; jaroslav@1799: import java.net.URL; jaroslav@1799: import java.util.Map; jaroslav@1799: import net.java.html.BrwsrCtx; jaroslav@1799: import org.apidesign.bck2brwsr.core.JavaScriptBody; jaroslav@1799: import org.netbeans.html.context.spi.Contexts; jaroslav@1799: import org.netbeans.html.json.spi.Technology; jaroslav@1799: import org.netbeans.html.json.spi.Transfer; jaroslav@1799: import org.netbeans.html.json.spi.WSTransfer; jaroslav@1799: import org.netbeans.html.json.tck.KnockoutTCK; jaroslav@1799: import org.netbeans.html.ko4j.KO4J; jaroslav@1799: import org.openide.util.lookup.ServiceProvider; jaroslav@1799: jaroslav@1799: /** jaroslav@1799: * jaroslav@1799: * @author Jaroslav Tulach jaroslav@1799: */ jaroslav@1799: @ServiceProvider(service = KnockoutTCK.class) jaroslav@1799: public final class Bck2BrwsrKnockoutImpl extends KnockoutTCK { jaroslav@1799: static Class[] createClasses() { jaroslav@1799: final Class[] arr = testClasses(); jaroslav@1799: for (int i = 0; i < arr.length; i++) { jaroslav@1799: if (arr[i].getSimpleName().startsWith("GC")) { jaroslav@1799: arr[i] = Object.class; jaroslav@1799: } jaroslav@1799: } jaroslav@1799: return arr; jaroslav@1799: } jaroslav@1799: jaroslav@1799: @Override jaroslav@1799: public BrwsrCtx createContext() { jaroslav@1799: KO4J ko = new KO4J(null); jaroslav@1799: return Contexts.newBuilder(). jaroslav@1799: register(Transfer.class, ko.transfer(), 9). jaroslav@1799: register(WSTransfer.class, ko.websockets(), 9). jaroslav@1799: register(Technology.class, ko.knockout(), 9).build(); jaroslav@1799: } jaroslav@1799: jaroslav@1799: jaroslav@1799: jaroslav@1799: @Override jaroslav@1799: public Object createJSON(Map values) { jaroslav@1799: Object json = createJSON(); jaroslav@1799: jaroslav@1799: for (Map.Entry entry : values.entrySet()) { jaroslav@1799: putValue(json, entry.getKey(), entry.getValue()); jaroslav@1799: } jaroslav@1799: return json; jaroslav@1799: } jaroslav@1799: jaroslav@1799: @JavaScriptBody(args = {}, body = "return new Object();") jaroslav@1799: private static native Object createJSON(); jaroslav@1799: jaroslav@1799: @JavaScriptBody(args = { "json", "key", "value" }, body = "json[key] = value;") jaroslav@1799: private static native void putValue(Object json, String key, Object value); jaroslav@1799: jaroslav@1799: @Override jaroslav@1799: public Object executeScript(String script, Object[] arguments) { jaroslav@1799: return execScript(script, arguments); jaroslav@1799: } jaroslav@1799: jaroslav@1799: @JavaScriptBody(args = { "s", "args" }, body = jaroslav@1799: "var f = new Function(s); return f.apply(null, args);" jaroslav@1799: ) jaroslav@1799: private static native Object execScript(String s, Object[] arguments); jaroslav@1799: jaroslav@1799: @JavaScriptBody(args = { }, body = jaroslav@1799: "var h;" jaroslav@1799: + "if (!!window && !!window.location && !!window.location.href)\n" jaroslav@1799: + " h = window.location.href;\n" jaroslav@1799: + "else " jaroslav@1799: + " h = null;" jaroslav@1799: + "return h;\n" jaroslav@1799: ) jaroslav@1799: private static native String findBaseURL(); jaroslav@1799: jaroslav@1799: @Override jaroslav@1799: public URI prepareURL(String content, String mimeType, String[] parameters) { jaroslav@1799: try { jaroslav@1799: final URL baseURL = new URL(findBaseURL()); jaroslav@1799: StringBuilder sb = new StringBuilder(); jaroslav@1799: sb.append("/dynamic?mimeType=").append(mimeType); jaroslav@1799: for (int i = 0; i < parameters.length; i++) { jaroslav@1799: sb.append("¶m" + i).append("=").append(parameters[i]); jaroslav@1799: } jaroslav@1799: String mangle = content.replace("\n", "%0a") jaroslav@1799: .replace("\"", "\\\"").replace(" ", "%20"); jaroslav@1799: sb.append("&content=").append(mangle); jaroslav@1799: jaroslav@1799: URL query = new URL(baseURL, sb.toString()); jaroslav@1799: String uri = (String) query.getContent(new Class[] { String.class }); jaroslav@1799: URI connectTo = new URI(uri.trim()); jaroslav@1799: return connectTo; jaroslav@1799: } catch (IOException ex) { jaroslav@1799: throw new IllegalStateException(ex); jaroslav@1799: } catch (URISyntaxException ex) { jaroslav@1799: throw new IllegalStateException(ex); jaroslav@1799: } jaroslav@1799: } jaroslav@1799: }