Hi Christian,

have you tried adding   effective="..." to the annotations and then
-resolve-effective:
...  to bndrun file?  Sorry for the dots but I never understood how to
determine what the values should be to make given resolver ignore or
enforce the requirement. I always play around with them until they give me
the desired result. I something think there are no more than 10 people on
this planet who actually understand this :)

Best,
Milen

On Thu, Aug 17, 2017 at 1:34 PM, Christian Schneider <
ch...@die-schneider.net> wrote:

> 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/maste
>>> r/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
>



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

Reply via email to