Today I ran into a few problems with the class loader Shindig is using in 
some of it's classes, specifically within the ResourceLoader and 
GuiceServletContextListener classes.  For my project I am embedding 
Shindig inside an Eclipse based application.  To do this we have decided 
to modularize Shindig a bit, and separate out the libraries (jars in the 
lib folder) Shindig uses into one plugin, and the actual web app into a 
different plugin.  Once I did this however Shindig could no longer find 
any of my guice modules, customized shindig.properties file, or customized 
container.js file living in the web app plugin.  In the end I figured out 
this was happening because of the class loader some of the Shindig classes 
use.  From what I found, it looks like we are either using the current 
classes class loader or doing Class.forName(className) to load classes and 
resources.  This is fine when a web app is running on Tomcat or Jetty but 
in OSGi this can possibly break.  In OSGi, the class loader will use the 
current bundle's context.  So if you have a class foo within a jar in 
bundle A using the methods in Shindig today to load a class bar from 
bundle B, the class foo will use bundle A's class loader and cannot find 
the class bar in bundle B.  The easiest way to fix this would be to try to 
use the class loader returned from 
Thread.currentThread().getContextClassLoader(), when the current codes 
class loader fails to load the class or resource requested.  So far I have 
found problems in ResourceLoader.openResource and 
GuiceServletContextListener.contextInitialized.  The problem in 
GuiceServletContextListener I can work around by extending this class and 
overriding contextInitialized, however there is no way for me to work 
around the problem in ResourceLoader, so I figured I would make the change 
in GuiceServletContextListener as well.  Does anyone have any objection to 
me making these changes, and does anyone know of other spots in Shindig 
where I may run into similar problems?

-Ryan

Email: [email protected]
Phone: 978-899-3041
developerWorks Profile

Reply via email to