I would definitely support this - I’m not sure how else to make bundles that 
implement contracts work reliably, and that impacts users too.

Regards,

Tim


> On 16 Sep 2016, at 08:26, 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 
> <mailto: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 <mailto:hargr...@us.ibm.com>
>  
>  
> ----- Original message -----
> From: Timothy Ward <tim.w...@paremus.com <mailto:tim.w...@paremus.com>>
> Sent by: osgi-dev-boun...@mail.osgi.org 
> <mailto:osgi-dev-boun...@mail.osgi.org>
> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org 
> <mailto: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 
> <mailto: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 <mailto:hargr...@us.ibm.com>
>  
>  
> ----- Original message -----
> From: Timothy Ward <tim.w...@paremus.com <mailto:tim.w...@paremus.com>>
> Sent by: osgi-dev-boun...@mail.osgi.org 
> <mailto:osgi-dev-boun...@mail.osgi.org>
> To: OSGi Developer Mail List <osgi-dev@mail.osgi.org 
> <mailto: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=JavaJPA;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=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”
>  
> 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 
> <mailto: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=JavaJPA)(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 
> <mailto: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 <mailto: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 <mailto: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 <mailto: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 <mailto: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 <mailto: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 <mailto: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 
> <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

Reply via email to