ok, this is even more convoluted:

1) you instantiate scriptEngineManager like this:

    public BXMLSerializer() {
        scriptEngineManager = new javax.script.ScriptEngineManager();

2) but sun is using TCCL:

    public ScriptEngineManager() {
        ClassLoader ctxtLoader =
Thread.currentThread().getContextClassLoader();
        if (canCallerAccessLoader(ctxtLoader)) {
            if (DEBUG) System.out.println("using " + ctxtLoader);
            init(ctxtLoader);
        } else {
            if (DEBUG) System.out.println("using bootstrap loader");
            init(null);
        }
    }

3) since I switch TCCL  context before I instantiate BXMLSerializer (so
it can see local bundle resources)
then this switch  makes script engine provider invisible to sun

-------- Original Message  --------
Subject: Re: pivot  + osgi : class loading?
From: Andrei Pozolotin <[email protected]>
To: [email protected]
Date: Sat 14 May 2011 04:37:28 PM CDT
> another problem: can not figure out why even with all workarounds
> mentioned before
> BXMLSerializer still fails to init javascript engine while in osgi
> plugin context:
>
> after this "###" breakpoint:
>
> BXMLSerializer::
>     private void processEndElement() throws SerializationException {
>
>                             // Create an invocation handler for this
> listener
> ###                       ScriptEngine scriptEngine =
> scriptEngineManager.getEngineByName(language);
>                             AttributeInvocationHandler handler =
>                                 new
> AttributeInvocationHandler(scriptEngine, attribute.name,
>                                     (String)attribute.value);
>
>
> ScriptEngine scriptEngine == null
>
>
> -------- 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