Hello,
We have an interrogation regarding iPojo instrumentation. We read
somewhere in the forum that iPopo can instrument inner classes, but we
are facing a problem when using them in our project.
Here is our use case:
A first component C1 provides a service with a method "callMe()".
Another component C2 requires this service.
Class C2
{
@Requires
Private C1 c1;
public boolean authenticate()
{
c1.callMe();
return true;
}
}
A third component C3 requires the component C2. This component C2 is
used inside an inner class MyFilter.
Class C3
{
@Requires
private C2 c2;
@Override
public MyFilter getFilter()
{
return new MyFilter()
{
@Override
public boolean authenticate()
{
return c2.authenticate();
}
};
}
}
At last, a component C4 listens for arrival and removal of C3 component
instances with @Bind/@Unbind methods.
Class C4
{
@Requires(id = "apis", optional = true)
C3[] apis;
@Bind(id = "apis")
public void addApi(ServiceReference ref)
{
C3 api = (C3) bundleCtxt.getService(ref);
filter = api.getFilter();
filter.authenticate();
}
}
Everything works perfectly the first time all the components are
started. But when we stop and restart the C1 and C2 instances, a
NullPointerException occurs when calling the method authenticate() of
the C2 component, because c1 is null. All the iPojo are present and
valid after the restart, but it seems c1 reference is not updated in c2.
We manage to make it work by modifiying a little bit the getFilter()
implementation in the C3 component:
Class C3
{
public MyFilter getFilter()
{
return new MyFilterImpl(c2);
}
}
where MyFilterImpl is an implementation of the MyFilter interface.
Does it trouble iPojo instrumentation when we instantiate inner classes
like we do or are we misusing iPojo in another way ?
Thanks
Olivier