Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [equinox-dev] Provide capability question

> On 21 Feb 2016, at 19:39, Lars Vogel <lars.vogel@xxxxxxxxxxx> wrote:
> 
> Hi,
> 
> I have two question about Provide capability and Require-Capability.
> 
> Background: you declare that you provide ds in version 1.2 via the
> following snippet in your MANIFEST.MF
> 
> Provide-Capability: osgi.extender;
> osgi.extender="osgi.component";
> version:Version="1.2";
> uses:="org.osgi.service.
> 
> A plug-in which requires his capablitiy defines the following:
> 
> Require-Capability: osgi.extender;
> filter:="(&(osgi.extender=osgi.component)(version>=1.2)(!(version>=2.0)))"
> 
> The first question is: Where is this defined that these are the
> correct entries? I use
> http://git.eclipse.org/c/equinox/rt.equinox.bundles.git/commit/?id=cff4c8e643032ce870dfc9e8279cd5fb16218f4e
> to "remember" the correct way to define it, but I guess there is a
> more general way.


For DS, see OSGi Compendium Specification R6, section 112.9.7.

Other OSGi specs also define the capabilities that should be declared by their providers. For example, section 105.12 declares the correct capability for the Metatype Service. Unfortunately, adding sections like this requires a bump of the specification version, so it has not been done universally for all specs… instead, the section is added opportunistically when the spec needs to be updated for other reasons.


> 
> The second question is. What is the correct way to use
> Provide-Capability and Provide-Capability for my customer code? In my
> example, I provide a service via DS and want to ensure that the
> consumer is only started if the service is available. I think
> Require-Capability is the correct way, but I have not seen an example
> for a customer capability yet.

For a service you can use the osgi.service namespace… see compendium section 135.4. The type of the service should be declared with the objectClass attribute. For example on the provide side:

	Provide-Capability: osgi.service; objectClass=org.example.IFoo

… and on the consume side:

	Require-Capability: osgi.service; filter:=“(osgi.service=org.example.IFoo)”; effective:=active

However you should be VERY careful with this for this following reasons:

1. Not every bundle providing a service actually declares it via the osgi.service capability. Particularly this is true for bundles that provide the service programmatically rather than via DS or some other declarative framework.
2. Even bundles that declare they provide a service don’t always *actually* provide it. For example they may only provide it some of the time, or under certain conditions. The declaration of a provided service is therefore nothing more than the *potential* to provide it.
3. Services can be provided remotely using OSGi Remote Services. Therefore if you put in a requirement for a service and use a resolver like the one in Bndtools to assemble your application, then you will force the provider of the service to be installed locally when you might have wanted it to be remote.

For these reasons, the Bndtools resolver usually ignores requirements in the osgi.service namespace.

Regards,
Neil


> 
> Best regards, Lars
> 
> -- 
> Eclipse Platform UI and e4 project co-lead
> CEO vogella GmbH
> 
> Haindaalwisch 17a, 22395 Hamburg
> Amtsgericht Hamburg: HRB 127058
> Geschäftsführer: Lars Vogel, Jennifer Nerlich de Vogel
> USt-IdNr.: DE284122352
> Fax (040) 5247 6322, Email: lars.vogel@xxxxxxxxxxx, Web: http://www.vogella.com
> _______________________________________________
> equinox-dev mailing list
> equinox-dev@xxxxxxxxxxx
> To change your delivery options, retrieve your password, or unsubscribe from this list, visit
> https://dev.eclipse.org/mailman/listinfo/equinox-dev



Back to the top