2009/5/7 Felix Meschberger <[email protected]> > Hi, > > Guillaume Nodet schrieb: > > > > In my case, the bundle exporting the service defines a class that > > indirectly implement the required interface by inheriting a class from > > another package. > > So I have 3 bundles: > > * bundle A defines an interface R and a class S in different > > packages, whith S implementing R > > * bundle B defines a class T extending S, it has an import statement > > on S package, but not on R package > > * bundle C defines a ServiceFactory that export T service without > > any import on any package from R, S, T > > Maybe the service registration is invalid because bundle B does not > > import R package, but the service actually implement the right > > interface > > Hmm, I fear, that in this case the framework is not able to validate the > registration and thus send events since the framework has no way of > telling which service interface (class object) is really implemented by > the factory. > > As I understand it, this corner case is not properly handled in the > spec, yet I would conclude from the specification, that not sending a > ServiceEvent is correct in this case: An event is only sent if the > service providing bundle and the event listener bundle use the service > class from the same source, or specifically if > ServiceReference.isAssignableTo(Bundle, String) returns true. > > Now, given the bundle providing the service (bundle C here) has no > wiring to the actual service class (R exported by bundle A) and hence > the isAssignableTo method will always return false. >
yes, that's how I read the spec: http://www.osgi.org/javadoc/r4v41/org/osgi/framework/ServiceReference.html#isAssignableTo(org.osgi.framework.Bundle,%20java.lang.String) "For the bundle that registered the service referenced by this ServiceReference (registrant bundle); find the source for the package. If no source is found then return true if the registrant bundle is equal to the specified bundle; otherwise return false." so if C is doing the registering, but doesn't have a wire for one of the packages then it seems only it can see the service. btw, you can always extend AllServiceListener to listen for all service events, regardless of class-compatibility Regards > Felix > > > > >> Regards > >> Felix > >> > >>> This leads to the service listener not being invoked because > >>> Util.isServiceAssignable() returns false. > >>> I think it's a problem, but I've no idea how to solve it. The only > >>> way I can think about is to actually check the service class returned > >>> by the factory instead of the factory, but it may cause side effects, > >>> not sure. > >>> > >>> Thoughts? > >>> > >>> -- > >>> Cheers, > >>> Guillaume Nodet > >>> ------------------------ > >>> Blog: http://gnodet.blogspot.com/ > >>> ------------------------ > >>> Open Source SOA > >>> http://fusesource.com > >>> > > > > > > > -- Cheers, Stuart
