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:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi-2.0.xsd">
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,