More descriptive error when one forgets to post-process @JavaScriptBody classes
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