On blueprint side:
1. use spring osgi namespace and you can change
<reference/> to a <list/> and enable
greedy-proxying
Instead of <blueprint..></blueprint>
use:
Instead of reference
<reference
id="host"
interface="org.eclipse.ecf.examples.remoteservices.hello.IHello"
availability="mandatory">
<reference-listener bind-method="bindHello">
<ref component-id="consumer" />
</reference-listener>
</reference>
Use list
<osgi:list id="hostInListWithGreedy"
interface="org.eclipse.ecf.examples.remoteservices.hello.IHello"
greedy-proxying="true" cardinality="1..N">
<osgi:listener bind-method="bindHello">
<ref bean="consumer" />
</osgi:listener>
</osgi:list>
Or use to specify 2 interfaces vs. 1.
<osgi:reference id="host" cardinality="1..1">
<osgi:interfaces>
<value>org.eclipse.ecf.examples.remoteservices.hello.IHello</value>
<value>org.eclipse.ecf.remoteservice.IRemoteServiceProxy</value>
</osgi:interfaces>
<osgi:listener bind-method="bindHello">
<ref bean="consumer"/>
</osgi:listener>
</osgi:reference>
2. Instead of osgi:reference or osgi:list - use
bean configuration
(something like this in spring bean style)
<bean id="host2"
class="org.eclipse.gemini.blueprint.service.importer.support.OsgiServiceProxyFactoryBean">
<property name="availability"
value="MANDATORY"/>
<property name="interfaces">
<list>
<value>org.eclipse.ecf.examples.remoteservices.hello.IHello</value>
<value>org.eclipse.ecf.remoteservice.IRemoteServiceProxy</value>
</list>
</property>
<property name="listeners">
<list>
<bean
class="org.eclipse.gemini.blueprint.config.internal.adapter.OsgiServiceLifecycleListenerAdapter">
<property name="bindMethod"
value="bindHello"/>
<property name="targetBeanName"
value="consumer"/>
<!-- or -->
<property name="target" ref="consumer"/>
</bean>
</list>
</property>
</bean>
There is a similar bean for <list/>
OsgiServiceCollectionProxyFactoryBean that can be
configured with greedy-proxying also.
I don't think there is anything blueprint can do to
expose
org.eclipse.ecf.remoteservice.IRemoteServiceProxy
without knowing that it exists if it is not in the
OBJECTCLASS property.
Another way forward for now is to get the target
service object from within Blueprint proxy.
ala.
ServiceReference nativeReference =
((ServiceReferenceProxy)serviceReference).getTargetServiceReference()
This way it is as naked as DS service object.
Hope this is all clear. I forked the blueECF github
project and will push changes to it later today.
Regards,