Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Eclipse Projects » Eclipse Communications Framework (ECF) » ClassNotFoundException with r-osgi and ECF (not with r-osgi only)
ClassNotFoundException with r-osgi and ECF (not with r-osgi only) [message #625404] Tue, 14 September 2010 14:18 Go to next message
Franky Bridelance is currently offline Franky Bridelance
Messages: 4
Registered: September 2010
Junior Member
Hi,

I'm new to this forum and I first would like to say that you - ECF guys - are doing great work! I'm using ECF implementation of the OSGi 4.2 Remote Service specification and it works like a charm.
Up till now I was using ecf generic as communication protocol but due to limitations (I'll post another topic about this) I decided to replace it with r-osgi. The move was easily done but I immediately encountered a CNFE during the remote service registration in the r-osgi bundle. Some investigation told me that it only happens when using r-osgi in combination with ECF: registering the service directly to r-osgi does not produce the CNFE.
Here are some details:

The CNFE happens with following code (I wanted to attach the code but I don't know how to do it):
+ Bundle A
- package org.myorg.pkga
- public class ClassA {
private ClassB myClassB;
}

- package org.myorg.pkgb
- public ClassB {
}

- package org.myorg.service.itf
- public interface MyService {
void someMethod(ClassA arg);
}

- MANIFEST.MF with Export-Package: org.myorg.pkga,org.myorg.pkgb,org.myorg.service.itf

+ Bundle B
- package org.myorg.service.impl
- public class MyServiceImpl implements MyService {
void someMethod(ClassA arg) {
// do something
}
}

- public class Activator implements BundleActivator {
public void start(...) {

// works with direct r-osgi registration
//properties.put(RemoteOSGiService.R_OSGi_REGISTRATION, Boolean.TRUE);

// does not work with ECF OSGi 4.2 Remote Service registration
properties.put("service.exported.interfaces", "*");
properties.put("service.exported.configs", "ecf.r_osgi.peer");

context.registerService(MyService.class.getName(), new MyServiceImpl(), properties);
}
}
- MANIFEST.MF with Import-Package: org.myorg.pkga, org.myorg.service.itf

+ Target platform containing the needed r-osgi and ecf bundles

The CNFE happens in the ch.ethz.iks.r_osgi.impl.RemoteServiceRegistration constructor during CodeAnalyzer.analyze method call. Apparently the CodeAnalyzer relies on the classloader of the registered service and the Import-Package and Export-Package headers of the bundle registering the service and that's where the direct r-osgi and ECF registrations differ:
- When registering the service with the r-osgi property, the service registration is handled directly by r-osgi bundle: classloader and the Import/Export-Package headers are from Bundle B
- when registering the service with the ECF (OSGi Remote Service) properties, the service registration is first handled by the ecf.provider.r_osgi bundle which will re-register the service with the r-osgi property and this service registration will then be handled by the r-osgi bundle: classloader is still from Bundle B (is easily retrieved from service object) but the Import/Export-Package headers are from ecf.provider.r_osgi bundle (are retrieved from the servicereference object).
Because the CodeAnalyzer doesn't get the expected Import/Export-Package headers (the ones from Bundle B) a CNFE is thrown during the call.

So this looks like a bug but I can't say where the fix should be: in r-osgi bundle or in ecf.provider.r_osgi bundle? I would tend to say that the ecf.provider.r_osgi bundle should register the service with the bundle context of the bundle providing the service instead of its own bundle context (unless there's a good reason not to do so), like when impersonating a bundle in the extender model but here it's not an extender and getting the bundle context of the original service might be a little tricky...
Re: ClassNotFoundException with r-osgi and ECF (not with r-osgi only) [message #628810 is a reply to message #625404] Fri, 24 September 2010 08:22 Go to previous message
Markus Kuppe is currently offline Markus Kuppe
Messages: 177
Registered: July 2009
Senior Member
On 09/14/2010 04:18 PM, Franky Bridelance wrote:
> Hi,
>
> I'm new to this forum and I first would like to say that you - ECF guys
> - are doing great work! I'm using ECF implementation of the OSGi 4.2
> Remote Service specification and it works like a charm.
> Up till now I was using ecf generic as communication protocol but due to
> limitations (I'll post another topic about this) I decided to replace it
> with r-osgi. The move was easily done but I immediately encountered a
> CNFE during the remote service registration in the r-osgi bundle. Some
> investigation told me that it only happens when using r-osgi in
> combination with ECF: registering the service directly to r-osgi does
> not produce the CNFE. Here are some details:
>
> The CNFE happens with following code (I wanted to attach the code but I
> don't know how to do it): + Bundle A
> - package org.myorg.pkga
> - public class ClassA {
> private ClassB myClassB;
> }
>
> - package org.myorg.pkgb
> - public ClassB {
> }
>
> - package org.myorg.service.itf
> - public interface MyService {
> void someMethod(ClassA arg);
> }
>
> - MANIFEST.MF with Export-Package:
> org.myorg.pkga,org.myorg.pkgb,org.myorg.service.itf
>
> + Bundle B
> - package org.myorg.service.impl
> - public class MyServiceImpl implements MyService {
> void someMethod(ClassA arg) {
> // do something
> }
> }
>
> - public class Activator implements BundleActivator {
> public void start(...) {
>
> // works with direct r-osgi registration
> //properties.put(RemoteOSGiService.R_OSGi_REGISTRATION,
> Boolean.TRUE);
>
> // does not work with ECF OSGi 4.2 Remote Service registration
> properties.put("service.exported.interfaces", "*");
> properties.put("service.exported.configs", "ecf.r_osgi.peer");
>
> context.registerService(MyService.class.getName(), new
> MyServiceImpl(), properties);
> }
> }
> - MANIFEST.MF with Import-Package: org.myorg.pkga, org.myorg.service.itf
>
> + Target platform containing the needed r-osgi and ecf bundles
>
> The CNFE happens in the
> ch.ethz.iks.r_osgi.impl.RemoteServiceRegistration constructor during
> CodeAnalyzer.analyze method call. Apparently the CodeAnalyzer relies on
> the classloader of the registered service and the Import-Package and
> Export-Package headers of the bundle registering the service and that's
> where the direct r-osgi and ECF registrations differ:
> - When registering the service with the r-osgi property, the service
> registration is handled directly by r-osgi bundle: classloader and the
> Import/Export-Package headers are from Bundle B
> - when registering the service with the ECF (OSGi Remote Service)
> properties, the service registration is first handled by the
> ecf.provider.r_osgi bundle which will re-register the service with the
> r-osgi property and this service registration will then be handled by
> the r-osgi bundle: classloader is still from Bundle B (is easily
> retrieved from service object) but the Import/Export-Package headers are
> from ecf.provider.r_osgi bundle (are retrieved from the servicereference
> object). Because the CodeAnalyzer doesn't get the expected
> Import/Export-Package headers (the ones from Bundle B) a CNFE is thrown
> during the call.
>
> So this looks like a bug but I can't say where the fix should be: in
> r-osgi bundle or in ecf.provider.r_osgi bundle? I would tend to say that
> the ecf.provider.r_osgi bundle should register the service with the
> bundle context of the bundle providing the service instead of its own
> bundle context (unless there's a good reason not to do so), like when
> impersonating a bundle in the extender model but here it's not an
> extender and getting the bundle context of the original service might be
> a little tricky...

This issue is now tracked at https://bugs.eclipse.org/325950

Markus
Previous Topic:Interface???
Next Topic:Remote service calls handled by one thread when using ecf generic?
Goto Forum:
  


Current Time: Sun Oct 26 03:13:20 GMT 2014

Powered by FUDForum. Page generated in 0.01552 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software