boot/src/main/java/net/java/html/boot/BrowserBuilder.java
changeset 771 ee3614350fc8
parent 736 8e6e4f811215
child 790 30f20d9c0986
     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                      }