It's worth checking (via the "inspect req osgi.wiring.package <bundle>" command) whether the import in Bundle 3 is actually wired to the exported package in Bundle 1.
For example if the bundles have been incorrectly packaged then you might have a second copy of the interface somewhere, and therefore the compatibility rules mentioned by Richard would be relevant. Neil On Thu, Feb 14, 2013 at 11:40 PM, Imóveis Nacionais < [email protected]> wrote: > My "AllServiceListener" takes place when serviceChanged( ) has just a print > to console. In this situation all osgi services fire the serviceChanged() > method. > > The problem appears when I build a 'special listener' (for example for > BundleService1 as i said) in order to fill an handle to the service to be > called later. In this situation, to declare a variable of service1 > interface to save the service object reference, I have to put the import > statement and the special listener does not detects service1 anymore, only > service 2,3, 4,etc... > > May be i am using ServiceListener in a worng way, but it is logic for me to > get the pointer to the service when it is up... > > Thanks > > Alex > > > > > On Thu, Feb 14, 2013 at 6:55 PM, Richard S. Hall <[email protected] > >wrote: > > > The OSGi framework attempts to deliver service events that are usable by > > your bundle (i.e., class compatible), so by having or not having imports > > and depending on the provider of your imports you may or may not see > events > > if the framework thinks they might cause you class cast problems. > > > > If you want to test this out, you can implement *AllServiceListener* as a > > test to see if you get all events; this listener will get all service > event > > irrespective of whether they might cause class cast exceptions. > > > > Generally, you only want to use an "all" listener if you are monitoring > an > > entire system, but not really interacting with services (or are using > > reflection to do so). Normally, you only want the framework sending > events > > to service you can access without a class cast exception using the normal > > ServiceListener. > > > > -> richard > > > > p.s. For completeness, here a description of what the Felix framework > > tries to do from ServiceRegistrationImpl.java: > > > > // There are four situations that may occur here: > > // 1. Neither the requester, nor provider have wires for > the > > package. > > // 2. The requester does not have a wire for the package. > > // 3. The provider does not have a wire for the package. > > // 4. Both the requester and provider have a wire for the > > package. > > // For case 1, if the requester does not have access to the > > class at > > // all, we assume it is using reflection and do not filter. > If > > the > > // requester does have access to the class, then we make sure > > it is > > // the same class as the service. For case 2, we do not > filter > > if the > > // requester is the exporter of the package to which the > > provider of > > // the service is wired. Otherwise, as in case 1, if the > > requester > > // does not have access to the class at all, we do not > filter, > > but if > > // it does have access we check if it is the same class > > accessible to > > // the providing revision. For case 3, the provider will not > > have a wire > > // if it is exporting the package, so we determine if the > > requester > > // is wired to it or somehow using the same class. For case > 4, > > we > > // simply compare the exporting revisions from the package > > wiring to > > // determine if we need to filter the service reference. > > > > > > On 2/14/13 11:50 , Imóveis Nacionais wrote: > > > >> Hi all, me again… > >> > >> > >> Suppose you have the following OSGi bundles and the related exposed > >> services: > >> > >> BundleService1 -> exports service 1 and interface for service 1 > >> > >> BundleService2 -> exports service 2 and interface for service 2 > >> > >> > >> > >> Now I want to write the Bundle3 which will use both Service1 and > Service2 > >> (for now, just service1). > >> > >> So, Bundle3 (activator class) implements BundleActivator and > >> ServiceListener. > >> > >> On start() I do: context.addServiceListener(**this); > >> > >> On the serviceChanged() method I simply have a print to console. > >> > >> This works with no problem. > >> > >> ------------------------------**------------------------------** > >> ------------------------------**------------------ > >> > >> Suppose now that you want to call service1 from serviceChanged method > >> (just > >> an example!): > >> > >> To call service1 I need to add dependence to pom.xml for BundleService1 > in > >> order to get reference and cast the reference to the service1 interface. > >> > >> Then, on the activator class I need to put an import for the service1 > >> interface. Then I get the reference, evaluate the property, cast it to > >> service1 and call the service1. > >> > >> > >> Now, testing this stuff: > >> > >> I install Bundle3 and start it. > >> > >> I install BundleService1 and start it. Nothing happens on bundle3 > >> serviceChanged!!! > >> > >> Then I install BundleService2 and start it. The bundle3 serviceChanged > is > >> called!!! > >> > >> > >> If I install and start any other bundles serviceChanged is always > called, > >> except for BundleService1! > >> > >> If I remove the import directive from Bundle3 (while the POM dependence > >> remains) and comment the related code, Bundle3 serviceChanged is called > >> for > >> BundleService1! > >> > >> > >> > >> My conclusion is that, the ServiceListener only works for those bundles > >> that have no “connection” (import) with Bundle3. Is this true? > >> > >> If this is true, how can I get the reference and cast to the service in > >> order to call it without using imports? > >> > >> > >> > >> Note: In an attempt to solve the problem I did the following: in the > >> serviceChanged I called another bundle3 class giving it the event in > order > >> to remove the import from activator class, and move it to the other > class. > >> But serviceChanged did not detects the Service1 too. It seems that if > the > >> (client) bundle project has an import for some service bundles those > >> bundles are not “detected” in the serviceChanged method. > >> > >> > >> > >> Thank you > >> > >> Alex > >> > >> > > > > ------------------------------**------------------------------**--------- > > To unsubscribe, e-mail: users-unsubscribe@felix.**apache.org< > [email protected]> > > For additional commands, e-mail: [email protected] > > > > >

