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,