jaroslav@1283: /** jaroslav@1283: * Back 2 Browser Bytecode Translator jaroslav@1283: * Copyright (C) 2012 Jaroslav Tulach jaroslav@1283: * jaroslav@1283: * This program is free software: you can redistribute it and/or modify jaroslav@1283: * it under the terms of the GNU General Public License as published by jaroslav@1283: * the Free Software Foundation, version 2 of the License. jaroslav@1283: * jaroslav@1283: * This program is distributed in the hope that it will be useful, jaroslav@1283: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@1283: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@1283: * GNU General Public License for more details. jaroslav@1283: * jaroslav@1283: * You should have received a copy of the GNU General Public License jaroslav@1283: * along with this program. Look for COPYING file in the top folder. jaroslav@1283: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@1283: */ jaroslav@1283: package org.apidesign.bck2brwsr.launcher.fximpl; jaroslav@1283: jaroslav@1283: import com.sun.javafx.scene.web.Debugger; jaroslav@1283: import java.io.IOException; jaroslav@1283: import java.io.ObjectInputStream; jaroslav@1283: import java.io.ObjectOutputStream; jaroslav@1283: import java.net.InetAddress; jaroslav@1283: import java.net.Socket; jaroslav@1283: import java.nio.charset.StandardCharsets; jaroslav@1283: import java.util.logging.Level; jaroslav@1283: import java.util.logging.Logger; jaroslav@1283: import javafx.application.Platform; jaroslav@1283: import javafx.scene.web.WebEngine; jaroslav@1283: import javafx.util.Callback; jaroslav@1283: import org.openide.util.Exceptions; jaroslav@1283: jaroslav@1283: /** jaroslav@1283: * jaroslav@1283: * @author Jaroslav Tulach jaroslav@1283: */ jaroslav@1283: final class FXInspect implements Runnable { jaroslav@1283: private static final Logger LOG = Logger.getLogger(FXInspect.class.getName()); jaroslav@1283: jaroslav@1283: jaroslav@1283: private final WebEngine engine; jaroslav@1283: private final ObjectInputStream input; jaroslav@1283: jaroslav@1283: private FXInspect(WebEngine engine, int port) throws IOException { jaroslav@1283: this.engine = engine; jaroslav@1283: jaroslav@1283: Socket socket = new Socket(InetAddress.getByName(null), port); jaroslav@1283: ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); jaroslav@1283: this.input = new ObjectInputStream(socket.getInputStream()); jaroslav@1283: initializeDebugger(output); jaroslav@1283: } jaroslav@1283: jaroslav@1283: static boolean initialize(WebEngine engine) { jaroslav@1283: final int inspectPort = Integer.getInteger("netbeans.inspect.port", -1); // NOI18N jaroslav@1283: if (inspectPort != -1) { jaroslav@1283: try { jaroslav@1283: FXInspect inspector = new FXInspect(engine, inspectPort); jaroslav@1283: Thread t = new Thread(inspector, "FX<->NetBeans Inspector"); jaroslav@1283: t.start(); jaroslav@1283: return true; jaroslav@1283: } catch (IOException ex) { jaroslav@1283: LOG.log(Level.INFO, "Cannot connect to NetBeans IDE to port " + inspectPort, ex); // NOI18N jaroslav@1283: } jaroslav@1283: } jaroslav@1283: return false; jaroslav@1283: } jaroslav@1283: jaroslav@1283: private void initializeDebugger(final ObjectOutputStream output) { jaroslav@1283: Platform.runLater(new Runnable() { jaroslav@1283: @Override jaroslav@1283: public void run() { jaroslav@1283: Debugger debugger = engine.impl_getDebugger(); jaroslav@1283: debugger.setEnabled(true); jaroslav@1283: debugger.setMessageCallback(new Callback() { jaroslav@1283: @Override jaroslav@1283: public Void call(String message) { jaroslav@1283: try { jaroslav@1283: byte[] bytes = message.getBytes(StandardCharsets.UTF_8); jaroslav@1283: output.writeInt(bytes.length); jaroslav@1283: output.write(bytes); jaroslav@1283: output.flush(); jaroslav@1283: } catch (IOException ioex) { jaroslav@1283: ioex.printStackTrace(); jaroslav@1283: } jaroslav@1283: return null; jaroslav@1283: } jaroslav@1283: }); jaroslav@1283: } jaroslav@1283: }); jaroslav@1283: } jaroslav@1283: jaroslav@1283: @Override jaroslav@1283: public void run() { jaroslav@1283: try { jaroslav@1283: while (true) { jaroslav@1283: int length = input.readInt(); jaroslav@1283: byte[] bytes = new byte[length]; jaroslav@1283: input.readFully(bytes); jaroslav@1283: final String message = new String(bytes, StandardCharsets.UTF_8); jaroslav@1283: Platform.runLater(new Runnable() { jaroslav@1283: @Override jaroslav@1283: public void run() { jaroslav@1283: engine.impl_getDebugger().sendMessage(message); jaroslav@1283: } jaroslav@1283: }); jaroslav@1283: } jaroslav@1283: } catch (IOException ioex) { jaroslav@1283: ioex.printStackTrace(); jaroslav@1283: } jaroslav@1283: } jaroslav@1283: }