launcher/fx/src/main/java/org/apidesign/bck2brwsr/launcher/FXBrwsrLauncher.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 08 Jun 2013 12:09:10 +0200
changeset 1169 c19ac78b940e
parent 1167 fd8ac9eb0008
child 1273 37ad459579bc
permissions -rw-r--r--
LiveHTML WebKitDebugging protocol through CLI that supports --livehtml command
     1 /**
     2  * Back 2 Browser Bytecode Translator
     3  * Copyright (C) 2012 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.
    13  *
    14  * You should have received a copy of the GNU General Public License
    15  * along with this program. Look for COPYING file in the top folder.
    16  * If not, see http://opensource.org/licenses/GPL-2.0.
    17  */
    18 package org.apidesign.bck2brwsr.launcher;
    19 
    20 import org.apidesign.bck2brwsr.launcher.fximpl.FXBrwsr;
    21 import java.io.IOException;
    22 import java.io.InputStream;
    23 import java.lang.reflect.Method;
    24 import java.net.URI;
    25 import java.net.URL;
    26 import java.net.URLClassLoader;
    27 import java.util.ArrayList;
    28 import java.util.Enumeration;
    29 import java.util.List;
    30 
    31 import java.util.concurrent.Executors;
    32 import java.util.jar.Manifest;
    33 import java.util.logging.Level;
    34 import java.util.logging.Logger;
    35 import javafx.application.Platform;
    36 import org.apidesign.bck2brwsr.launcher.fximpl.JVMBridge;
    37 
    38 /**
    39  *
    40  * @author Jaroslav Tulach <jtulach@netbeans.org>
    41  */
    42 final class FXBrwsrLauncher extends BaseHTTPLauncher {
    43     private static final Logger LOG = Logger.getLogger(FXBrwsrLauncher.class.getName());
    44     static {
    45         try {
    46             Method m = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
    47             m.setAccessible(true);
    48             URL l = new URL("file://" + System.getProperty("java.home") + "/lib/jfxrt.jar");
    49             LOG.log(Level.INFO, "url : {0}", l);
    50             m.invoke(ClassLoader.getSystemClassLoader(), l);
    51         } catch (Exception ex) {
    52             throw new LinkageError("Can't add jfxrt.jar on the classpath", ex);
    53         }
    54     }
    55 
    56     public FXBrwsrLauncher(String ignore) {
    57         super(null);
    58     }
    59 
    60     @Override
    61     protected Object[] showBrwsr(final URI url) throws IOException {
    62         try {
    63             LOG.log(Level.INFO, "showBrwsr for {0}", url);
    64             JVMBridge.registerClassLoaders(loaders());
    65             LOG.info("About to launch WebView");
    66             Executors.newSingleThreadExecutor().submit(new Runnable() {
    67                 @Override
    68                 public void run() {
    69                     LOG.log(Level.INFO, "In FX thread. Launching!");
    70                     try {
    71                         List<String> params = new ArrayList<String>();
    72                         params.add(url.toString());
    73                         if (isDebugged()) {
    74                             params.add("--toolbar=true");
    75                             params.add("--firebug=true");
    76                             String ud = System.getProperty("netbeans.user");
    77                             if (ud != null) {
    78                                 params.add("--userdir=" + ud);
    79                             }
    80                         }
    81                         FXBrwsr.launch(FXBrwsr.class, params.toArray(new String[params.size()]));
    82                         LOG.log(Level.INFO, "Launcher is back. Closing");
    83                         close();
    84                         System.exit(0);
    85                     } catch (Throwable ex) {
    86                         LOG.log(Level.WARNING, "Error launching Web View", ex);
    87                     }
    88                 }
    89             });
    90         } catch (Throwable ex) {
    91             LOG.log(Level.WARNING, "Can't open WebView", ex);
    92         }
    93         return null;
    94     }
    95     
    96     @Override
    97     void generateBck2BrwsrJS(StringBuilder sb, Res loader) throws IOException {
    98         sb.append("(function() {\n"
    99             + "  var impl = this.bck2brwsr;\n"
   100             + "  this.bck2brwsr = function() { return impl; };\n");
   101         sb.append("})(window);\n");
   102         JVMBridge.onBck2BrwsrLoad();
   103     }
   104 
   105     @Override
   106     public void close() throws IOException {
   107         super.close();
   108         Platform.exit();
   109     }
   110 
   111     String harnessResource() {
   112         return "org/apidesign/bck2brwsr/launcher/fximpl/harness.xhtml";
   113     }
   114 
   115     public static void main(String... args) throws IOException {
   116         String startPage = null;
   117 
   118         final ClassLoader cl = FXBrwsrLauncher.class.getClassLoader();
   119         startPage = findStartPage(cl, startPage);
   120         if (startPage == null) {
   121             throw new NullPointerException("Can't find StartPage tag in manifests!");
   122         }
   123         
   124         Launcher.showURL("fxbrwsr", cl, startPage);
   125     }
   126     
   127     private static String findStartPage(final ClassLoader cl, String startPage) throws IOException {
   128         Enumeration<URL> en = cl.getResources("META-INF/MANIFEST.MF");
   129         while (en.hasMoreElements()) {
   130             URL url = en.nextElement();
   131             Manifest mf;
   132             InputStream is = null;
   133             try {
   134                 is = url.openStream();
   135                 mf = new Manifest(is);
   136             } finally {
   137                 if (is != null) is.close();
   138             }
   139             String sp = mf.getMainAttributes().getValue("StartPage");
   140             if (sp != null) {
   141                 startPage = sp;
   142                 break;
   143             }
   144         }
   145         return startPage;
   146     }
   147     
   148     private static boolean isDebugged() {
   149         try {
   150             return isDebuggedImpl();
   151         } catch (LinkageError e) {
   152             return false;
   153         }
   154     }
   155 
   156     private static boolean isDebuggedImpl() {
   157         java.lang.management.RuntimeMXBean runtime;
   158         runtime = java.lang.management.ManagementFactory.getRuntimeMXBean();
   159         List<String> args = runtime.getInputArguments();
   160         if (args.contains("-Xdebug")) { // NOI18N
   161             return true;
   162         }
   163         return false;
   164     }
   165 }