this is additionally compounded by

    public final Object readObject(Class<?> baseType, String
resourceName, boolean localize)
        throws IOException, SerializationException {
        if (baseType == null) {
            throw new IllegalArgumentException("baseType is null.");
        }

        if (resourceName == null) {
            throw new IllegalArgumentException("resourceName is null.");
        }

        return readObject(baseType.getResource(resourceName),
            localize ? new Resources(baseType.getName()) : null);
    }

which uses baseType.getResource(resourceName) instead of
Thread.currentThread().getContextClassLoader().getResource()

so the complete workaround is this kludge:

                        Thread thread = Thread.currentThread();
                        ClassLoader tccl = thread.getContextClassLoader();
                        try {

                           
thread.setContextClassLoader(getClass().getClassLoader());

                            BXMLSerializer bxml = new BXMLSerializer();

                            URL url =
getClass().getResource("LoginComponent.bxml");
                            window = (Window) bxml.readObject(url);
                            window.open(display);

                        } finally {
                            thread.setContextClassLoader(tccl);
                        }


-------- Original Message  --------
Subject: pivot  + osgi : class loading?
From: Andrei Pozolotin <[email protected]>
To: [email protected]
Date: Fri 13 May 2011 10:35:37 PM CDT
>
>     *Greg, *hello;
>
>      
>     1) I am hitting in the following issue while trying to run pivot
>     in osgi environment:
>
>     this example
>           http://pivot.apache.org/tutorials/labels-and-image-views.html
>
>     |<||Window| |title||=||"Labels"| |maximized||=||"true"|
>     |    ||xmlns:bxml||=||"http://pivot.apache.org/bxml";|
>     |    ||xmlns||=||"org.apache.pivot.wtk"||>|
>     |    ||<||BoxPane| |styles||=||"{padding:4,
>     verticalAlignment:'center'}"||>|
>     |        ||<||ImageView| |image||=||"/clock.png"||/>|
>     |        ||<||Label| |text||=||"What time is it?"||/>|
>     |    ||</||BoxPane||>|
>     |</||Window||>|
>
>
>     2) in terms of |ImageView| properties, it is getting translated by
>     BXMLSerializer into a call |*setImage(String imageName)*| ,
>     which fails to locate resource:
>
>     |||ImageView ::
>         /**
>          * Sets the image view's image by {@linkplain
>     ClassLoader#getResource(String)
>          * resource name}.
>          *
>          * @param imageName
>          * The resource name of the image to set.
>          *
>          * @see #setImage(URL)
>          */
>     *    public final void setImage(String imageName) {
>     *        if (imageName == null) {
>                 throw new IllegalArgumentException("imageName is null.");
>             }
>
>     *        ClassLoader classLoader =
>     Thread.currentThread().getContextClassLoader();
>             setImage(classLoader.getResource(imageName.substring(1)));
>     *    }
>
>     |2) note that in my case the pivot package classes and 
>     [AWT-EventQueue-0] event queues are instantiated in osgi host
>     class loader
>          
>     
> http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html
>     but the actual call to |setImage(String imageName)| is executed in
>     osgi plugin class loader;
>
>     just to give you an example, when this snipped gets executed
>     inside osgi plugin bundle:
>
>                             // class loader used by pivot
>                             ClassLoader loader =
>     Thread.currentThread().getContextClassLoader();
>                             URL urlPivot = loader.getResource("");
>     *                        log.info("urlPivot : {} ", urlPivot);
>     *
>                             // class loader used by plugin bundle
>                             URL urlOSGI = getClass().getResource("");
>     *                        log.info("urlOSGI  : {}", urlOSGI);
>     *
>     it produces this log:
>
>     22:08:46.876 [AWT-EventQueue-0] INFO 
>     com.carrotgarden.core.LoginComponent - urlPivot :
>     
> file:/home/user1/Workspaces/github/carrot-tester/carrot-test-osgi-ws/carrot-test-osgi-pivot-host/target/test-classes/
>
>
>     22:08:46.876 [AWT-EventQueue-0] INFO 
>     com.carrotgarden.core.LoginComponent - urlOSGI  :
>     bundle://7.0:1/com/carrotgarden/core/
>
>     as you can see,
>     *      urlPivot :
>     
> file:/home/user1/Workspaces/github/carrot-tester/carrot-test-osgi-ws/carrot-test-osgi-pivot-host/target/test-classes/
>
>     *resolves back to osgi host class loader which is not visible by
>     the the client plugin
>
>     and
>     *     urlOSGI  : bundle://7.0:1/com/carrotgarden/core/
>     *resolves inside calling osgi bundle name space as expected;
>
>
>     3) am I missing something obvious?
>     why do you use current class loading approach in pivot?
>     are you open to change this?
>     what would your recommend instead?
>
>
>     Thank you,
>
>     Andrei.
>

Reply via email to