More descriptive error when one forgets to post-process @JavaScriptBody classes
authorJaroslav Tulach <jtulach@netbeans.org>
Tue, 09 Dec 2014 11:00:52 +0100
changeset 8972e416426cab0
parent 896 43a5880b2d79
child 898 18e17d0cd066
More descriptive error when one forgets to post-process @JavaScriptBody classes
boot/src/main/java/net/java/html/boot/BrowserBuilder.java
boot/src/main/java/org/netbeans/html/boot/impl/FnContext.java
     1.1 --- a/boot/src/main/java/net/java/html/boot/BrowserBuilder.java	Tue Dec 09 10:42:58 2014 +0100
     1.2 +++ b/boot/src/main/java/net/java/html/boot/BrowserBuilder.java	Tue Dec 09 11:00:52 2014 +0100
     1.3 @@ -283,18 +283,24 @@
     1.4          
     1.5          final ClassLoader activeLoader;
     1.6          if (loader != null) {
     1.7 -            if (!FnContext.isJavaScriptCapable(loader)) {
     1.8 -                throw new IllegalStateException("Loader cannot resolve @JavaScriptBody: " + loader);
     1.9 +            final URL res = FnContext.isJavaScriptCapable(loader);
    1.10 +            if (res != null) {
    1.11 +                throw new IllegalStateException("Loader " + loader + 
    1.12 +                    " cannot resolve @JavaScriptBody, because of " + res
    1.13 +                );
    1.14              }
    1.15              activeLoader = loader;
    1.16 -        } else if (FnContext.isJavaScriptCapable(myCls.getClassLoader())) {
    1.17 -            activeLoader = myCls.getClassLoader();
    1.18          } else {
    1.19 -            if (!FnContext.isAsmPresent()) {
    1.20 -                throw new IllegalStateException("Cannot find asm-5.0.jar classes!");
    1.21 +            final URL res = FnContext.isJavaScriptCapable(myCls.getClassLoader());
    1.22 +            if (res == null) {
    1.23 +                activeLoader = myCls.getClassLoader();
    1.24 +            } else {
    1.25 +                if (!FnContext.isAsmPresent(res)) {
    1.26 +                    throw new IllegalStateException("Cannot find asm-5.0.jar classes!");
    1.27 +                }
    1.28 +                FImpl impl = new FImpl(myCls.getClassLoader());
    1.29 +                activeLoader = FnUtils.newLoader(impl, dfnr, myCls.getClassLoader().getParent());
    1.30              }
    1.31 -            FImpl impl = new FImpl(myCls.getClassLoader());
    1.32 -            activeLoader = FnUtils.newLoader(impl, dfnr, myCls.getClassLoader().getParent());
    1.33          }
    1.34          
    1.35          final Fn.Presenter dP = dfnr;
     2.1 --- a/boot/src/main/java/org/netbeans/html/boot/impl/FnContext.java	Tue Dec 09 10:42:58 2014 +0100
     2.2 +++ b/boot/src/main/java/org/netbeans/html/boot/impl/FnContext.java	Tue Dec 09 11:00:52 2014 +0100
     2.3 @@ -42,9 +42,14 @@
     2.4   */
     2.5  package org.netbeans.html.boot.impl;
     2.6  
     2.7 +import java.io.BufferedReader;
     2.8  import java.io.Closeable;
     2.9  import java.io.Flushable;
    2.10  import java.io.IOException;
    2.11 +import java.io.InputStreamReader;
    2.12 +import java.io.PrintWriter;
    2.13 +import java.io.StringWriter;
    2.14 +import java.net.URL;
    2.15  import java.util.logging.Level;
    2.16  import java.util.logging.Logger;
    2.17  import org.netbeans.html.boot.spi.Fn;
    2.18 @@ -62,17 +67,16 @@
    2.19          DUMMY.prev = DUMMY;
    2.20      }
    2.21  
    2.22 -    public static boolean isJavaScriptCapable(ClassLoader l) {
    2.23 +    public static URL isJavaScriptCapable(ClassLoader l) {
    2.24          if (l instanceof JsClassLoader) {
    2.25 -            return true;
    2.26 +            return null;
    2.27          }
    2.28 -        if (l.getResource("META-INF/net.java.html.js.classes") != null) {
    2.29 -            return false;
    2.30 -        }
    2.31 -        return true;
    2.32 +        return l.getResource("META-INF/net.java.html.js.classes");
    2.33      }
    2.34  
    2.35 -    public static boolean isAsmPresent() {
    2.36 +    public static boolean isAsmPresent(URL res) {
    2.37 +        StringWriter w = new StringWriter();
    2.38 +        PrintWriter pw = new PrintWriter(w);
    2.39          Throwable t;
    2.40          try {
    2.41              Class.forName("org.objectweb.asm.Opcodes"); // NOI18N
    2.42 @@ -82,10 +86,28 @@
    2.43          } catch (ClassNotFoundException ex) {
    2.44              t = ex;
    2.45          }
    2.46 -        LOG.log(Level.SEVERE, "When using @JavaScriptBody methods, one needs to either:");
    2.47 -        LOG.log(Level.SEVERE, " - include asm-5.0.jar on runtime classpath");
    2.48 -        LOG.log(Level.SEVERE, " - post process classes, see http://bits.netbeans.org/html+java/dev/net/java/html/js/package-summary.html#post-process");
    2.49 -        LOG.log(Level.SEVERE, "Cannot initialize asm-5.0.jar!", t);
    2.50 +        pw.println("When using @JavaScriptBody methods, one needs to either:");
    2.51 +        pw.println(" - include asm-5.0.jar on runtime classpath");
    2.52 +        pw.println(" - post process classes, see http://bits.netbeans.org/html+java/dev/net/java/html/js/package-summary.html#post-process");
    2.53 +        pw.append("However following classes has not been processed from ").println(res);
    2.54 +        
    2.55 +        try {
    2.56 +            BufferedReader r = new BufferedReader(new InputStreamReader(res.openStream()));
    2.57 +            for (;;) {
    2.58 +                String line = r.readLine();
    2.59 +                if (line == null) {
    2.60 +                    break;
    2.61 +                }
    2.62 +                pw.append("  ").println(line);
    2.63 +            }
    2.64 +            r.close();
    2.65 +        } catch (IOException io) {
    2.66 +            pw.append("Cannot read ").println(res);
    2.67 +            io.printStackTrace(pw);
    2.68 +        }
    2.69 +        pw.println("Cannot initialize asm-5.0.jar!");
    2.70 +        pw.flush();
    2.71 +        LOG.log(Level.SEVERE, w.toString(), t);
    2.72          return false;
    2.73      }
    2.74