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,