>
> I agree with Christian that this should be clearly documented in a wiki
> somewhere.


Please someone, DO document this!
I already moved this thread to my "Things about OSGi that you need to read
at least 5 times before they start making sense" folder :) but for anyone
not on this list, it would be really helpful to have this documented!



On Fri, Sep 16, 2016 at 6:13 PM, Elliot Huntington <
elliot.hunting...@gmail.com> wrote:

> I agree with Christian that this should be clearly documented in a wiki
> somewhere. My personal opinion is that a bare-bones enroute JPA example
> would be a good place for this.
>
> Elliot
>
> On Fri, Sep 16, 2016 at 9:26 AM, Thomas Watson <tjwat...@us.ibm.com>
> wrote:
>
>> Regardless, should the best practice for providing osgi.contract
>> capabilities be to only provide one capability per osgi.contract name?  And
>> use Lists for attributes where you want to express multiple version support?
>>
>> I know for a fact there are Servlet 2.5 applications that will simply
>> break if run on a Servlet 3.0 implementation.  If the best practice is to
>> provide distinct osgi.contract capabilities for each 'version' then these
>> types of user bundles will have issues binding to the correct contract.
>>
>> Tom
>>
>>
>>
>>
>>
>> From:        BJ Hargrave/Austin/IBM@IBMUS
>> To:        osgi-dev@mail.osgi.org
>> Date:        09/16/2016 10:08 AM
>> Subject:        Re: [osgi-dev] The JPA spec bundle does not work with
>> jpa 2.1
>> Sent by:        osgi-dev-boun...@mail.osgi.org
>> ------------------------------
>>
>>
>>
>> As Tom mentions, when a bundle provides multiple contracts, the filter of
>> the requirement only has to match one of the contracts. So adding an
>> additional filter expression like (version<=2.1) does not exclude the
>> bundle which also offers the contract at version=3.
>>
>> As an implementation bundle, contracts do not really help you. They were
>> meant for using bundles: consumers of the API, not implementers of the API.
>>
>> The API bundle which provides the contract should probably export the
>> packages with version(s) that the implemention bundle can import against to
>> establish the tighter coupling between the API and the implementation.
>>
>> --
>>
>> BJ Hargrave
>> Senior Technical Staff Member, IBM // office: +1 386 848 1781
>> OSGi Fellow and CTO of the OSGi Alliance // mobile: +1 386 848 3788
>> hargr...@us.ibm.com
>>
>>
>> ----- Original message -----
>> From: Timothy Ward <tim.w...@paremus.com>
>> Sent by: osgi-dev-boun...@mail.osgi.org
>> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org>
>> Cc:
>> Subject: Re: [osgi-dev] The JPA spec bundle does not work with jpa 2.1
>> Date: Thu, Sep 15, 2016 5:16 PM
>>
>> BJ - My understanding is that contract versions don’t work like normal
>> semantic versions (if only they did…) and that version 2.0.1 may be totally
>> incompatible with version 2.0.0. I therefore don’t think it’s safe to use a
>> range like “[2.1,2.2)”. My understanding of their intended use is that
>> consumers select an exact version of the contract using “=“, and that
>> providers declare the versions that they support. What I’m trying to do is
>> to work out what providers and substitutable exporters should do.
>>
>> To use a concrete example that actually exists.
>>
>> If I write a Servlet 3.0 container, then I need to wire to the Servlet
>> 3.0 API. The Servlet 2.5 API will be missing interfaces that I need,
>> causing NoClassDefFoundErrors, and the Servlet 3.1 API will have methods
>> that I don’t implement, causing NoSuchMethodErrors if called at runtime.
>>
>> I do, however, want the providers of the servlet packages to offer the
>> servlet contract to consumers at backward compatible versions so that a
>> Servlet 2.5 Servlet can be used on a Servlet 3.1 implementation. This is my
>> understanding of why the contracts exist.
>>
>> Therefore we have the following three API bundles, with contracts taken
>> from *https://www.osgi.org/portable-java-contract-definitions/*
>> <https://www.osgi.org/portable-java-contract-definitions/>
>>
>> *A* (Servlet 2.5):
>>
>> Export-Package: javax.servlet, javax.servlet.http
>> Provide-Capability: osgi.contract;
>>  osgi.contract=JavaServlet; version:Version=2.5; uses:="javax.servlet,
>>  javax.servlet.http"
>>
>>
>> *B* (Servlet 3.0):
>>
>> Export-Package: javax.servlet, javax.servlet.http
>> Provide-Capability: osgi.contract; osgi.contract=JavaServlet;
>> version:Version=3;
>>  uses:="javax.servlet, javax.servlet.http", osgi.contract;
>>  osgi.contract=JavaServlet; version:Version=2.5; uses:="javax.servlet,
>>  javax.servlet.http"
>>
>> *C* (Servlet 3.1)
>>
>> Export-Package: javax.servlet, javax.servlet.http
>> Provide-Capability: osgi.contract; osgi.contract=JavaServlet;
>> version:Version=3.1;
>>  uses:=“javax.servlet, javax.servlet.http",
>>  osgi.contract; osgi.contract=JavaServlet; version:Version=3;
>>  uses:="javax.servlet, javax.servlet.http", osgi.contract;
>>  osgi.contract=JavaServlet; version:Version=2.5; uses:="javax.servlet,
>>  javax.servlet.http"
>>
>>
>> What imports/requirements should I put in my Servlet 3.0 implementation
>> bundle to make it work? As a client I can use 
>> (&(osgi.contract=JavaServlet)(version=3.0))
>> to pick either B or C, but as a provider I need to match the exports from
>> API Bundle B, and only bundle B. This is why I’m trying to further restrict
>> the requirement to be “3.0 or bust”, in an effort to exclude bundle C.
>>
>> Regards,
>>
>> Tim
>>
>> On 15 Sep 2016, at 12:17, BJ Hargrave <*hargr...@us.ibm.com*
>> <hargr...@us.ibm.com>> wrote:
>>
>> But they are anded. So version=2.1 is the range[2.1,2.1]. This second
>> range for version<=2.1 is [0,2.1]. So the intersection of those ranges is
>> exactly 2.1. So the expression version<=2.1 adds no value.
>>
>> If you want the range [2.1,2.2) then your filter expression is
>> (&(version>=2.1)(!(version>=2.2)))
>>
>> --
>>
>> BJ Hargrave
>> Senior Technical Staff Member, IBM // office: +1 386 848 1781
>> OSGi Fellow and CTO of the OSGi Alliance // mobile: +1 386 848 3788
>> *hargr...@us.ibm.com* <hargr...@us.ibm.com>
>>
>>
>> ----- Original message -----
>> From: Timothy Ward <*tim.w...@paremus.com* <tim.w...@paremus.com>>
>> Sent by: *osgi-dev-boun...@mail.osgi.org*
>> <osgi-dev-boun...@mail.osgi.org>
>> To: OSGi Developer Mail List <*osgi-dev@mail.osgi.org*
>> <osgi-dev@mail.osgi.org>>
>> Cc:
>> Subject: Re: [osgi-dev] The JPA spec bundle does not work with jpa 2.1
>> Date: Thu, Sep 15, 2016 2:58 PM
>>
>> That was my intention. If I am a provider of version 2.1 of the JPA API
>> then I need access to types defined in JPA 2.1, hence the (version=2.1). As
>> a provider of the JPA API I also need to guarantee that I don’t wire to
>> some future, backward-compatible version of the JPA API packages, as I
>> won’t provide implementations for any new methods, hence adding
>> (version<=2.1).
>>
>> I see this as the contract equivalent of a provider import range (e.g.
>> “[1,1.1)”), whereas the typical consumer range (e.g. “[1,2)”) is handled as
>> per David’s email. I do understand that this looks strange, but it’s the
>> only way that I can see to have substitutability for this API, or to have
>> the API delivered separately from the JPA provider implementation.
>>
>> I appreciate any further insight that others may have!
>>
>> Regards,
>>
>> Tim
>>
>>
>> On 15 Sep 2016, at 11:47, BJ Hargrave <*hargr...@us.ibm.com*
>> <hargr...@us.ibm.com>> wrote:
>>
>> "(&(osgi.contract=JavaJPA)(version=2.1)(version<=2.1))"will only match
>> exactly version 2.1 since the next term is anded.
>>
>>
>> --
>>
>> BJ Hargrave
>> Senior Technical Staff Member, IBM // office: +1 386 848 1781
>> OSGi Fellow and CTO of the OSGi Alliance // mobile: +1 386 848 3788
>> *hargr...@us.ibm.com* <hargr...@us.ibm.com>
>>
>>
>> ----- Original message -----
>> From: Timothy Ward <*tim.w...@paremus.com* <tim.w...@paremus.com>>
>> Sent by: *osgi-dev-boun...@mail.osgi.org*
>> <osgi-dev-boun...@mail.osgi.org>
>> To: OSGi Developer Mail List <*osgi-dev@mail.osgi.org*
>> <osgi-dev@mail.osgi.org>>
>> Cc:
>> Subject: Re: [osgi-dev] The JPA spec bundle does not work with jpa 2.1
>> Date: Thu, Sep 15, 2016 2:12 PM
>>
>> Hi Christian,
>>
>> Yes, this is a mess, and yes, it is hard. The JSR process has done a good
>> job of making versioning as hard as possible!
>>
>> For some extra help, bnd will do the contract import for your consumer if
>> you use the -contract instruction (see
>> *http://bnd.bndtools.org/chapters/220-contracts.html*
>> <http://bnd.bndtools.org/chapters/220-contracts.html>). Contracts are
>> the only reliable way for clients to deal with the inconsistent JSR
>> versioning policies.
>>
>> *I’m writing the following section because I know that Christian is also
>> an implementor, and so needs to work out how to deal with the JPA provider
>> side too. The information below is not needed by people who just want to
>> use JPA in their applications.*
>>
>> Contracts work well for consuming the API in a client, but the
>> requirement for providers that want substitutability (or just to use an
>> external API bundle) is harder and I don’t think bnd helps much. To be
>> substitutable you would need to write the contract so that you import the
>> correct version, but not any version higher than that (otherwise clients
>> may get NoSuchMethodErrors when trying to call API from higher versions.
>>
>> The following is my best guess at how to make the maximum number of
>> things work!
>>
>> The requirement filter looks very odd, and is expressed as follows
>> (&(osgi.contract=JavaJPA)(version=2.1)(version<=2.1)):
>>
>> For substitutable JPA 2.1 that works with current EclipseLink and
>> Hibernate releases the metadata needs to be:
>>
>> Export-Package:javax.persistence; javax.persistence.criteria;
>> javax.persistence.metamodel; javax.persistence.spi;version=2.1.0;jpa=2.1
>> Import-Package: javax.persistence, javax.persistence.criteria,
>> javax.persistence.metamodel, javax.persistence.spi
>> Require-Capability: osgi.contract;filter:=“(&(osgi
>> .contract=JavaJPA)(version=2.1)(version<=2.1))”
>> Provide-Capability: osgi.contract:osgi.contract=Ja
>> vaJPA;version:Version=2.1;uses:=“javax.persistence,javax.
>> persistence.criteria,javax.persistence.metamodel,javax.persistence.spi”,
>> osgi.contract:osgi.contract=JavaJPA;version:Version=2.0;uses
>> :=“javax.persistence,javax.persistence.criteria,javax.
>> persistence.metamodel,javax.persistence.spi”,
>> osgi.contract:osgi.contract=JavaJPA;version:Version=1.0;uses
>> :=“javax.persistence,javax.persistence.spi”
>>
>> For substitutable JPA 2.0 that works with OpenJPA, and older EclipseLink
>> and Hibernate releases:
>>
>> Export-Package:javax.persistence; javax.persistence.criteria;
>> javax.persistence.metamodel; javax.persistence.spi;version=2.0.0;jpa=2.0
>> Import-Package: javax.persistence, javax.persistence.criteria,
>> javax.persistence.metamodel, javax.persistence.spi
>> Require-Capability: osgi.contract;filter:=“(&(osgi
>> .contract=JavaJPA)(version=2.0)(version<=2.0))”
>> Provide-Capability: osgi.contract:osgi.contract=Ja
>> vaJPA;version:Version=2.0;uses:=“javax.persistence,javax.
>> persistence.criteria,javax.persistence.metamodel,javax.persistence.spi”,
>> osgi.contract:osgi.contract=JavaJPA;version:Version=1.0;uses
>> :=“javax.persistence,javax.persistence.spi”
>>
>> This is what Aries JPA and Transaction Control need to do when providing
>> the JPA API, and it will be described in the upcoming JPA Service update.
>>
>> Note that all of this will probably still not help with JPA providers
>> that have even crazier import ranges, but we do what we can.
>>
>> Regards,
>>
>> Tim
>>
>>
>> On 15 Sep 2016, at 05:15, David Bosschaert <*david.bosscha...@gmail.com*
>> <david.bosscha...@gmail.com>> wrote:
>>
>> Hi Christian,
>>
>> The portable contracts define how you should do your imports with
>> JSR-based APIs, since they often don't follow semantic versioning. What
>> should really be done is:
>>
>> Import-Package: javax.persistence, javax.persistence.criteria,
>> javax.persistence.metamodel, javax.persistence.spi
>> Require-Capability: osgi.contract; filter:="(&(osgi.contract=Java
>> JPA)(version=2.1))"
>>
>> Note that the Import-Package in this case has no version associated with
>> the packages. This is because there is no agreed semantic versioning
>> associated with these packages. So providers of the JPA package can version
>> these using whatever schema they want.
>> Consumers bind to the specific version of JPA via the Require-Capability
>> which specifies the exact version needed (not a range). Implementations
>> list all the version numbers of the JSR-spec that they are compatible with.
>> For more info see [1] and [2].
>>
>> Obviously this only works when the OSGi-JPA provider implementation
>> supports osgi.contract by providing the JavaJPA capability for all the
>> versions that it is compatible with (1, 2 and 2.1). For older OSGi-JPA
>> implementations this may not be the case as it may be that they predate the
>> osgi.contract namespace...
>>
>> Best regards,
>>
>> David
>>
>> [1] *http://blog.osgi.org/2014/09/portable-java-contracts-for-javax.html*
>> <http://blog.osgi.org/2014/09/portable-java-contracts-for-javax.html>
>> [2] *https://www.osgi.org/portable-java-contract-definitions/*
>> <https://www.osgi.org/portable-java-contract-definitions/>
>>
>>
>> On 15 September 2016 at 12:31, Christian Schneider <
>> *ch...@die-schneider.net* <ch...@die-schneider.net>> wrote:
>> Unfortunately the spec only defines the jpa package properties up to jpa
>> 2.0. Do the OSGi specs already define JPA 2.1 somewhere?
>>
>> I just checked some of the JPA API bundles and they provide very
>> different package versions.
>>
>> org.eclipse.persistence:javax.persistence:2.1.0 has
>> javax.persistence;jpa="2.1";version="2.1.0"
>>
>> org.apache.geronimo.specs:geronimo-jpa_2.1_spec:1.0-alpha-1 has
>> javax.persistence;jpa="2.1";version="1.2"
>>
>> Which of these is correct?
>>
>> How would a client correctly express the dependency to the jpa 2.0 or 2.1
>> API?
>> I see that there is also jpa=2.1 on the package export. Can the be used
>> to describe the import?
>>
>> Currently I use a version range of [2.1,2.2) in my own code. Not sure if
>> this is correct.
>>
>> I think it would also make sense to recommend specific maven coordinates
>> for each persistence spec as a kind of offical spec bundle to use. Elese
>> people might choose the wrong and end up with broken imports.
>>
>> Christian
>>
>> On 08.07.2016 15:41, Christian Schneider wrote:
>> Done
>> *https://osgi.org/bugzilla/show_bug.cgi?id=189*
>> <https://osgi.org/bugzilla/show_bug.cgi?id=189>
>>
>> Christian
>>
>> On 08.07.2016 14:49, Raymond Auge wrote:
>> Christian could you file a bug on the public OSGi bugzilla so we don't
>> forget to fix this?
>>
>> I wonder if the spec bundle should refer to javax.persistence via
>> Portable Java Contract rather then by package version. We have a similar
>> issue with the org.osgi.service.http bundle which I believe should also
>> refer to a PJC for javax.servlet.
>>
>> *https://osgi.org/bugzilla/buglist.cgi*
>> <https://osgi.org/bugzilla/buglist.cgi>
>>
>> - Ray
>>
>>
>>
>> --
>> Christian Schneider
>> *http://www.liquid-reality.de* <http://www.liquid-reality.de/>
>>
>> Open Source Architect
>> *http://www.talend.com* <http://www.talend.com/>
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> *osgi-dev@mail.osgi.org* <osgi-dev@mail.osgi.org>
>> *https://mail.osgi.org/mailman/listinfo/osgi-dev*
>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
>> _______________________________________________
>> OSGi Developer Mail List
>> *osgi-dev@mail.osgi.org* <osgi-dev@mail.osgi.org>
>> *https://mail.osgi.org/mailman/listinfo/osgi-dev*
>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
>> _______________________________________________
>> OSGi Developer Mail List
>> *osgi-dev@mail.osgi.org* <osgi-dev@mail.osgi.org>
>> *https://mail.osgi.org/mailman/listinfo/osgi-dev*
>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
>>
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> *osgi-dev@mail.osgi.org* <osgi-dev@mail.osgi.org>
>> *https://mail.osgi.org/mailman/listinfo/osgi-dev*
>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
>> _______________________________________________
>> OSGi Developer Mail List
>> *osgi-dev@mail.osgi.org* <osgi-dev@mail.osgi.org>
>> *https://mail.osgi.org/mailman/listinfo/osgi-dev*
>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
>>
>>
>> _______________________________________________
>> OSGi Developer Mail List
>> *osgi-dev@mail.osgi.org* <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*
>> <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
>>
>>
>>
>> _______________________________________________
>> 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
>



-- 
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