Hi Peter,

thanks for your help.

I do not cast the type. The user only uses the RComponent interface. The idea of the component model is that the user of component is not exposed to the implementation details of a component. This is of course the root of the problem of why I need more than java types. It is the same for camel.

I just tried to create a custom annotation but the result in the manifest looked a bit strange so I now first try to use plain @RequireCapability and @ProvideCapability. When I got this working I will try again with a custom annotation to make it easier to use.

This is what I got now..
On my mqtt component I define:
@ProvideCapability( ns="rcomp", name="mqtt")

It results in this Provide-Capability header:
rcomp;rcomp=mqtt

In my rcomp-example bundle I use:
@RequireCapability(ns="rcomp", filter="(rcomp=mqtt)")

It results in this Require-Capability header:
rcomp;filter:="(rcomp=mqtt)"

So I think this looks good.

Strangely when I create my bndrun with a requirement on rcomp-example and do a resolve then it does not add my rcomp-mqtt bundle.

When I then run the framework it fails with this error:
could not resolve the bundles: [rcomp-examples-1.0.0.201708171022 org.osgi.framework.BundleException: Unable to resolve rcomp-examples [12](R 12.0): missing requirement [rcomp-examples [12](R 12.0)] rcomp; (rcomp=mqtt) Unresolved requirements: [[rcomp-examples [12](R 12.0)] rcomp; (rcomp=mqtt)]
]

Shouldn't the resolver automatically add the rcomp-mqtt bundle and even abort the resolve in case the bundle is not available in the repository?

Best
Christian



On 17.08.2017 10:31, Peter Kriens wrote:
The purpose of the @Reference.target is to be overridden by configuration, 
adding the filter to the requirement would basically destroy that use case.

For what you want there is a very good solution: Plain Old Java Types … I 
suspect that in your code you already do some casting to a more specific type 
from RComponent? If that is the case then you have a bad code smell, which is 
also visible in Camel I think. We ‘know’ the type but we’re forced to go to 
properties to line things up as we want.

However, I am guessing so you might need it in a different scenario. If you 
want to do what you want I think you can use the annotation support in bnd for 
requirements.

        @RequireCapability( ns=“osgi.service”, 
filter=“(&(objectClass=org.apache.karaf.rcomp.api.RComponent)(name=${value}))” )
        @interface ReqRc { String value(); }

        @ReqRc(“mqtt” )
        @Component(property=“name=mqtt”)
        public class …

Hope this helps.

Kind regards,

        Peter Kriens

On 17 Aug 2017, at 10:07, Christian Schneider <ch...@die-schneider.net> wrote:

I am currently working on a little framework that offers components with a 
common service interface but different property value per component.

LIke:

https://github.com/cschneider/reactive-components/blob/master/rcomp-mqtt/src/main/java/org/apache/karaf/rcomp/mqtt/MqttComponent.java
@Component(property="name=mqtt")

A user of the mqtt component will use a filter like this:
@Reference(target="(name=mqtt)")

Bnd creates a requirement like this:
osgi.service;filter:="(objectClass=org.apache.karaf.rcomp.api.RComponent)";effective:=active

The requirement does not include the filter.

It would be nice if bndtools or karaf later could help me by auto picking or 
recommending the mqtt component bundle when the user bundle is required.

Can I somehow make bnd create a requirement including a filter? .. or 
alternatively is there another easy to use way how a specific provider can 
announce itself and a user bundle can specify the requirement for a specific 
provider?

I think this same problem applies to Apache Camel. When a user bundle uses a 
certain camel component then the resolver currently does not help with this and 
the bundle fails at runtime.

Christian

--
Christian Schneider
http://www.liquid-reality.de

Open Source Architect
http://www.talend.com

_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev
_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev


--
Christian Schneider
http://www.liquid-reality.de

Open Source Architect
http://www.talend.com

_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to