1.1 --- a/boot/src/main/java/net/java/html/boot/BrowserBuilder.java Thu Jul 17 18:01:03 2014 +0200
1.2 +++ b/boot/src/main/java/net/java/html/boot/BrowserBuilder.java Thu Jul 31 14:36:00 2014 +0200
1.3 @@ -108,6 +108,7 @@
1.4 private String methodName;
1.5 private String[] methodArgs;
1.6 private final Object[] context;
1.7 + private ClassLoader loader;
1.8
1.9 private BrowserBuilder(Object[] context) {
1.10 this.context = context;
1.11 @@ -186,6 +187,22 @@
1.12 return this;
1.13 }
1.14
1.15 + /** Loader to use when searching for classes to initialize.
1.16 + * If specified, this loader is going to be used to load {@link Fn.Presenter}
1.17 + * and {@link Contexts#fillInByProviders(java.lang.Class, org.apidesign.html.context.spi.Contexts.Builder) fill} {@link BrwsrCtx} in.
1.18 + * Specifying special classloader may be useful in modular systems,
1.19 + * like OSGi, where one needs to load classes from many otherwise independent
1.20 + * modules.
1.21 + *
1.22 + * @param l the loader to use (or <code>null</code>)
1.23 + * @return this builder
1.24 + * @since 0.9
1.25 + */
1.26 + public BrowserBuilder classloader(ClassLoader l) {
1.27 + this.loader = l;
1.28 + return this;
1.29 + }
1.30 +
1.31 /** Shows the browser, loads specified page in and executes the
1.32 * {@link #invoke(java.lang.String, java.lang.String[]) initialization method}.
1.33 * The method returns when the browser is closed.
1.34 @@ -277,6 +294,11 @@
1.35 }
1.36 }
1.37
1.38 + if (dfnr == null && loader != null) for (Fn.Presenter o : ServiceLoader.load(Fn.Presenter.class, loader)) {
1.39 + dfnr = o;
1.40 + break;
1.41 + }
1.42 +
1.43 if (dfnr == null) for (Fn.Presenter o : ServiceLoader.load(Fn.Presenter.class)) {
1.44 dfnr = o;
1.45 break;
1.46 @@ -286,12 +308,17 @@
1.47 throw new IllegalStateException("Can't find any Fn.Presenter");
1.48 }
1.49
1.50 - final ClassLoader loader;
1.51 - if (FnUtils.isJavaScriptCapable(myCls.getClassLoader())) {
1.52 - loader = myCls.getClassLoader();
1.53 + final ClassLoader activeLoader;
1.54 + if (loader != null) {
1.55 + if (!FnUtils.isJavaScriptCapable(loader)) {
1.56 + throw new IllegalStateException("Loader cannot resolve @JavaScriptBody: " + loader);
1.57 + }
1.58 + activeLoader = loader;
1.59 + } else if (FnUtils.isJavaScriptCapable(myCls.getClassLoader())) {
1.60 + activeLoader = myCls.getClassLoader();
1.61 } else {
1.62 FImpl impl = new FImpl(myCls.getClassLoader());
1.63 - loader = FnUtils.newLoader(impl, dfnr, myCls.getClassLoader().getParent());
1.64 + activeLoader = FnUtils.newLoader(impl, dfnr, myCls.getClassLoader().getParent());
1.65 }
1.66
1.67 final Fn.Presenter dP = dfnr;
1.68 @@ -303,8 +330,8 @@
1.69 final Fn.Presenter aP = Fn.activePresenter();
1.70 final Fn.Presenter currentP = aP != null ? aP : dP;
1.71
1.72 - Thread.currentThread().setContextClassLoader(loader);
1.73 - final Class<?> newClazz = Class.forName(myCls.getName(), true, loader);
1.74 + Thread.currentThread().setContextClassLoader(activeLoader);
1.75 + final Class<?> newClazz = Class.forName(myCls.getName(), true, activeLoader);
1.76 if (browserClass != null) {
1.77 browserClass[0] = newClazz;
1.78 }