Peter is correct. If bundleTM defines the service factory impl class and 
uses its own context to register the service, then the framework considers 
it a private service for use only by the registering bundle.

If you add a 4th bundle (bundleProxy), then bundleTM can use bundleProxy's 
context to register the service and bundleB's ServiceTracker will see the 
service. So you should add a bundle which is used as the "host" of all the 
proxied services. This bundle can be completely empty.

I have confirmed this with a test case. See 
git://github.com/bjhargrave/ServiceProxying.git
-- 

BJ Hargrave
Senior Technical Staff Member, IBM
OSGi Fellow and CTO of the OSGi Alliance
[email protected]

office: +1 386 848 1781
mobile: +1 386 848 3788





From:   Scott Lewis <[email protected]>
To:     [email protected]
Date:   2011/02/21 12:33
Subject:        Re: [osgi-dev] Classloader accessibility and 
ServiceTracker.open(true)
Sent by:        [email protected]



On 2/21/2011 8:54 AM, Thomas Watson wrote: 

https://bugs.eclipse.org/bugs/show_bug.cgi?id=326918

I just looked at the code again.  It should work as long as the registrant 
bundle has no wire to the package in question AND the service was 
registered using a ServiceFactory.  If you are seeing something else, 
please open an equinox bug.

Ok, this is not what I'm seeing (i.e. the RSA proxy service factory code 
is not working in 3.7m4)...at least as evidenced by 
ServiceTracker.open(true) requirement.

I'm going to be away the remainder of today, so cannot open a bug until 
tomorrow, but if a test case exists/is created (as per BJ's request) then 
a test that would match my use case:

In consumer framework:

Bundle A:  org.foo.IFoo.class (service type)
Bundle TM:  registers a proxy-creating ServiceFactory upon async network 
discovery.  Has no import of org.foo package and IFoo is not dynamically 
loaded.
Bundle B:  imports org.foo package, creates ServiceTracker to be notified 
about org.foo.IFoo remote services.

If Bundle B uses ServiceTracker.open(true), it is notified about the proxy 
ServiceFactory registration, and calls getService(B)...which uses 
B.loadClass to load the org.foo.IFoo class, and create and return a proxy. 
 

If Bundle B uses ServiceTracker.open(), it is not notified about the proxy 
ServiceFactory, and so getService is never called to create actual proxy.

I'm assuming ServiceTracker.open(true) being required is because of 
ServiceReference#isAssignable returning false for the proxy ServiceFactory 
as per https://bugs.eclipse.org/bugs/show_bug.cgi?id=326918

Please let me know if I need to create this test code myself...I could do 
so, but probably will not until tomorrow or later this week.

Scott






Tom

[email protected] wrote: -----

To: [email protected]
From: Scott Lewis <[email protected]>
Sent by: [email protected]
Date: 02/21/2011 10:03AM
Subject: Re: [osgi-dev] Classloader accessibility and 
ServiceTracker.open(true)

Hi Peter,

Although I'm very happy to hear this, I've been running/testing on 3.7M4 
version of Equinox and I'm still seeing the problem (i.e. proxy 
ServiceFactory registered by TM bundle...without dynamic 
import:*...still doesn't pass compatibility check).

Maybe I need to do something else to trigger this new behavior (?)...if 
so please let me know.  Do you (or Guillaume) have a bug number for the 
ServiceFactory bug?

Thanks all for the help with this.

Scott

On 2/21/2011 7:33 AM, Peter Kriens wrote:
> Did some deeper digging and I think we have an interesting issue.
>
> ECF RSA should work with +M3 release of 3.7 Equinox. It turns out that a 
bug requested by Guillaume Nodet relaxed the rules for Service Factory 
services. If the registrant of the service cannot see the package for any 
of the service name classes then it is assumed that he Service Factory 
will do the right thing. So with a Service Factory you should be able to 
register an appropriate proxy for each bundle, at least in equinox.
>
> Unfortunately, there seems to be some inconsistency here between the 
frameworks. I will get to the bottom of this.
>
> Kind regards,
>
>      Peter Kriens
>
>
> On 21 feb 2011, at 11:49, Peter Kriens wrote:
>
>> I think we have think a bit deeper. Assume you have 2 exporters of IFoo 
that are both compatible with the proxy you generate. Shouldn't you create 
a proxy for both?
>>
>> I think the only viable solution is to register the proxy with each 
distinct exporter of IFoo's package for which you're compatible with to 
ensure you do not leave anybody out in the cold.
>>
>> Logically, 4.3's new registerService(Class<S>,S,Map) method should 
provide you with the capability but I am afraid the current definition of 
the compatibility is in limbo because it is unfortunately defined in terms 
of isAssignableTo, which unfortunately is string based instead of class 
based. I think we need to define a Class<?>  version of this method that 
we then use for compatibility when possible. This will allow you to 
register objects from the DP that are compatible with other bundles even 
though you do not import the service interfaces. I file an errata so this 
is looked into.
>>
>> Oh, how I long for the days of OSGi R3 when we did not have multiple 
versions :-(
>>
>> Kind regards,
>>
>>      Peter Kriens
>>
>>
>> On 21 feb 2011, at 07:00, Scott Lewis wrote:
>>
>>> On 2/20/2011 6:14 PM, BJ Hargrave wrote:
>>>> <stuff deleted>
>>>>
>>>> You could use dynamic import package but that has some drawbacks. 
First you would need to actually load the type(s) to force  the framework 
to establish the wires before you register the service. Second, you could 
only support one version of the package could be a big limitation.
>>> Yes, I see how supporting only one version of a package could be a big 
limitation.
>>>
>>>> This is why I previously suggested dynamically creating, installing 
and starting a bundle which has the proper import package statement. This 
bundle does not need any classes in it. You just need an "anchor" to use 
for its class loader to access the types and for its context to register 
the service. The actual work can be done by your bundle. Make sure to 
properly uninstall this bundle when no longer necessary. There can be many 
of these bundles for different service types.
>>> Forgive me, but this approach seems kind of clumsy and complex to 
manage to me...as it could be necessary to create, install, start and 
manage/uninstall a lot of these dynamic bundles...i.e. one for each 
distinct imported remote service.
>>>
>>> Are there any viable approaches other than this?   e.g. can the wiring 
of the RSA (or TopologyManager) bundle be dynamically manipulated...to 
allow the RSA or TM itself to register the proxy service factory?
>>>
>>> Thanks,
>>>
>>> Scott
>>>
>>>
>>> _______________________________________________
>>> OSGi Developer Mail List
>>> [email protected]
>>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> [email protected]
>> https://mail.osgi.org/mailman/listinfo/osgi-dev
>
> _______________________________________________
> OSGi Developer Mail List
> [email protected]
> https://mail.osgi.org/mailman/listinfo/osgi-dev

_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev



_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to