This is actually how the code used to read a while back. I don't remember why it was changed to use the context class loader. I don't see a problem in reverting it. G
On May 15, 2011, at 10:48 AM, Andrei Pozolotin wrote: > FYI: > > this example: > http://pivot.apache.org/tutorials/list-buttons.html > > is misleading in osgi environment, due to use of TCCL > > // Get the image URL for the selected item > ClassLoader classLoader = > Thread.currentThread().getContextClassLoader(); > URL imageURL = > classLoader.getResource("org/apache/pivot/tutorials/" + selectedItem); > > assuming your resources are in plugin bundle (and not pivot host bundle) > it should be instead > > ClassLoader classLoader = getClass().getClassLoader(); > > -------- 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. >> >
