Cleaner, but the main problem is that it does not work with legacy code. Will you rewrite the jaxb2 implementation to do that instead of using the stax factory ? ;-) We've got tons of legacy stuff that use stax, or jaxb2 and i don't see rewriting the whole lot as realistic. it would also mean having an OSGi specific thing everywhere we use a factory from a j2ee spec :-(
On Thu, Apr 17, 2008 at 4:24 PM, Alan D. Cabrera <[EMAIL PROTECTED]> wrote: > > > On Apr 17, 2008, at 6:54 AM, Guillaume Nodet wrote: > > > > On Thu, Apr 17, 2008 at 1:27 PM, Jacek Laskowski <[EMAIL PROTECTED]> > wrote: > > > > > On Wed, Apr 16, 2008 at 5:20 PM, Guillaume Nodet <[EMAIL PROTECTED]> > wrote: > > > > > > > > > > However, lots of these spec jars define factories (stax, saaj for > example) > > > > that use the META-INF/services/ discovery mechanism to find an > > > > implementation of the spec and load it. This mechanism does not fit > well in > > > > OSGi (really, it does not), mainly because usually, the classloader > > > > containing the spec jar will not contain the implementation. > > > > I'd like to work on these spec jars so that they will contain an OSGi > > > > BundleActivator that would change the behavior of these factories when > > > > deployed in an OSGi environment (without changing the behavior in > other > > > > case). The idea is that the activator would scan OSGi bundles when > they are > > > > started to find META-INF/services and populate a map that would be > used by > > > > the factory when creating an object before using the standard > mechanism. > > > > > > > > > > Just to ensure I'm following, you are about to create a activator that > > > would be a bundle listener (o.o.f.BundleListener) and whenever a > > > bundle is registered the activator will scan it for provided services? > > > Can you explain how osgi works now without these > > > META-INF/services-based services? Doesn't it use them at all? > > > > > > > This is the tricky part. The work we've done on the specs so far > > means that each spec > > is an OSGi bundle. In OSGi, each bundle has each own classloader and > > classloaders > > are not organized in a simple tree: if bundle A requires bundle B and > > bundle B requires > > bundle C, it does not mean that C will be accessible to A. Following so > far ? > > So, let's say I create a bundle that references the Stax Api. > > My bundle will have the geronimo stax api in its classpath. The stax > > implementation that > > I deploy will also have the stax api in its classpath, but it won't be > > available to either > > the the stax api or my bundle. > > The problem happens when the stax api needs to find and create the > > implementation. > > Usually, the existing code won't be able to do that at all, because > > the META-INF/services > > and the implementation class are not available from the stax api > classloader. > > One way to work around that is (if the api uses the thread context > > classloader) to make sure > > my bundle includes the implementation in its classloader and make sure > > the thread context > > classloader is correctly set. This usually involves copying the > > META-INF/services/xx stuff > > in our bundle and explicitely referencing the implementation to make > > sure the classloader > > includes it. > > > > The problem is that it's a bit annoying to do that on all the bundles > > and it does prevent > > swicthing implementations. > > > > So now, there is no need to reference the implementation from the > > bundle. The spec jar bundle > > activator will use OSGi to find the META-INF/services/ entries each > > time a bundle is installed > > and if an implementation is used, will load the class through OSGi > > API, using the implementation > > bundle classloader instead of the spec jar classloader. > > > > I think, just my personal opinion, that scouring bundles' META-INF/services > entries is kinda klunky. Could we not use a service/whiteboard approach > that is common in OSGi? When in Rome, do as the Romans do. > > Let's assume that we go with the virgin spec jar wrapped in a bundle > paradigm I spoke of in a previous post. Here the bundles that use the stax > api would register stax api service implementations. The stax api would > catch those service registrations and properly configure the factory. A > bit cleaner imo and you don't have to search every bundle. > > > Regards, > Alan > > -- Cheers, Guillaume Nodet ------------------------ Blog: http://gnodet.blogspot.com/