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

Reply via email to