Hi Alain,

Sorry this took you so long to work out - Sunday isn’t the best time to get a 
response I’m afraid! 

<tldr>
In summary - this should have “just worked” for you. I’m sorry that it didn’t, 
but unfortunately in this case the web container implementation that you are 
using has some packaging bugs that make it break in certain scenarios.

I would suggest raising bugs agains PAX-Web to see if you can get them to fix 
these issues.
</tldr>

Explanation follows:

> By debugging the Aries Whiteboard activator, it is looking for a service 
> matching; 
> "(&(objectClass=org.osgi.service.http.runtime.HttpServiceRuntime)(osgi.http.endpoint=*))”

Part of the JAX-RS Whiteboard specification requires the JaxrsServiceRuntime 
service to advertise its root URI as a service property so that other services 
can work out where the resources will be hosted. The Aries JAX-RS Whiteboard 
implementation does not provide its own web container and instead makes use of 
the Http Whiteboard. This means that it has to query the HttpServiceRuntime 
service to work out what the base URI is. Note that this is an implementation 
decision - Aries JAX-RS Whiteboard could have provided its own embedded web 
container, but the consensus was that it should focus on JAX-RS and allow 
people to combine it into their existing web applications.

> This was colliding between org.ops4j.pax.web.pax-web-api (which I see as 
> being used by the working copy) and in my case "org.eclipse.osgi.services" 
> and "org.osgi.service.http.whiteboard 1.1" as well. I got rid of 
> "org.eclipse.osgi.services"and instead locally use the org.osgi.* bundles and 
> for the http.whiteboard, I lowered my import package to 1.0 to match paxweb 
> export package version and the issue is gone. I honestly think that 
> "org.eclipse.osgi.services" is evil.

Much like the osgi.cmpn bundle, bundles which aggregate a bunch of otherwise 
unrelated APIs into an uber bundle are a bad thing. This is why the osgi.cmpn 
bundle has been made unresolvable (i.e. not possible to deploy) and the 
org.eclipse.osgi.services bundle should do the same.

That being said - the main issue isn’t related to the org.eclipse.osgi.services 
bundle, but actually as a result of bad metadata in the pax web Http Whiteboard 
implementation. The Aries JAX-RS Whiteboard contains the following requirement:

Require-Capability: 
osgi.implementation;filter:="(&(osgi.implementation=osgi.http)(version>=1)(!(version>=2)))"

This requirement is there to ensure two things:

To make sure that an Http Whiteboard implementation is resolved and deployed
To make sure that the OSGi framework wires up the package space in the correct 
way

Item 2 is the problem that you are seeing, and it’s because the PAX-Web 
implementation is failing to properly provide the implementation capability. 
This is how it is supposed to be provided 
(https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e121954
 
<https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e121954>)

osgi.implementation;osgi.implementation="osgi.http";version:Version="1.0";uses:="javax.servlet,javax.servlet.http,org.osgi.service.http.context,org.osgi.service.http.whiteboard"

The bundle org.ops4j.pax.web.pax-web-runtime does do exactly this, but the 
person who did it failed to understand what a uses constraint actually meant. 
Specifically it’s an instruction to the resolver to say that “A bundle wired to 
this capability must use the same package instances as the provider of the 
capability for these packages”. The problem is that the 
org.ops4j.pax.web.pax-web-runtime doesn’t use these packages! A uses constraint 
is only valuable if the bundle either imports or exports the package that it 
refers to, otherwise the resolver is free to make any choice it likes when 
resolving your bundles. This is what you were seeing happen, and is why the 
JAX-RS Whiteboard was wired to an incompatible version of the Http Whiteboard 
packages.

To fix this PAX Web needs to be updated to put the http whiteboard capability 
on the correct bundle (in this case 
org.ops4j.pax.web.pax-web-extender-whiteboard) which is the bundle that appears 
to actually implement the Http Whiteboard, and is wired to all the packages. I 
would also note that Pax Web puts the osgi.service capability for the 
HttpServiceRuntime service on the org.ops4j.pax.web.pax-web-runtime bundle, 
even though this bundle is not the one that provides the service! This could 
lead to yet more nonsense when provisioning.

Best Regards,

Tim
  
> On 2 Dec 2018, at 16:21, Alain Picard via osgi-dev <osgi-dev@mail.osgi.org> 
> wrote:
> 
> Ok,
> 
> After another 10 hours of frustration, I finally solved the issue. By 
> debugging the Aries Whiteboard activator, it is looking for a service 
> matching; 
> "(&(objectClass=org.osgi.service.http.runtime.HttpServiceRuntime)(osgi.http.endpoint=*))".
>  Happens that I am having resolver chain issues with this specifically (and 
> my colleague is not, which I can't explain).
> 
> This was colliding between org.ops4j.pax.web.pax-web-api (which I see as 
> being used by the working copy) and in my case "org.eclipse.osgi.services" 
> and "org.osgi.service.http.whiteboard 1.1" as well. I got rid of 
> "org.eclipse.osgi.services"and instead locally use the org.osgi.* bundles and 
> for the http.whiteboard, I lowered my import package to 1.0 to match paxweb 
> export package version and the issue is gone. I honestly think that 
> "org.eclipse.osgi.services" is evil.
> 
> Cheers,
> Alain
> 
> On Sat, Dec 1, 2018 at 5:43 PM Alain Picard <pic...@castortech.com 
> <mailto:pic...@castortech.com>> wrote:
> Banging my head trying to figure out why my jaxrs is not starting properly.
> 
> One of my colleague is running what should be the same environment and it 
> works in his, but he has seen issues at time.
> 
> In my log I see:
> 17:28:09.870 [Start Level: Equinox Container: 
> 8adb54b2-c97b-4651-9844-16e93c4d8f80] DEBUG o.o.p.w.e.w.i.Activator - Pax Web 
> Whiteboard Extender started
> 17:28:10.863 [Start Level: Equinox Container: 
> 8adb54b2-c97b-4651-9844-16e93c4d8f80] DEBUG 
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - Starting the whiteboard factory
> 17:28:10.901 [Start Level: Equinox Container: 
> 8adb54b2-c97b-4651-9844-16e93c4d8f80] INFO  
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - Registered ClientBuilder
> 17:28:10.905 [Start Level: Equinox Container: 
> 8adb54b2-c97b-4651-9844-16e93c4d8f80] INFO  
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - Registered SseEventSourceFactory
> 17:28:10.914 [Start Level: Equinox Container: 
> 8adb54b2-c97b-4651-9844-16e93c4d8f80] DEBUG 
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - adding new whiteboard configuration: 
> {service.pid=org.apache.aries.jax.rs.whiteboard.default}
> 17:28:10.948 [Start Level: Equinox Container: 
> 8adb54b2-c97b-4651-9844-16e93c4d8f80] DEBUG 
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - Whiteboard factory started
> 17:28:11.021 [Start Level: Equinox Container: 
> 8adb54b2-c97b-4651-9844-16e93c4d8f80] DEBUG o.o.p.w.s.i.Activator - Starting 
> Pax Web
> 
> And there is no reference to AriesJaxrsServiceRuntim.
> 
> Looking for JaxrsServiceRuntime returns that it is registered:
> se org.osgi.service.jaxrs.runtime.JaxrsServiceRuntime
> {org.osgi.service.jaxrs.runtime.JaxrsServiceRuntime}={service.id 
> <http://service.id/>=55, service.bundleid=11, service.scope=singleton, 
> service.ranking=-2147483648, 
> service.pid=org.apache.aries.jax.rs.whiteboard.default}
>   "Registered by bundle:" org.apache.aries.jax.rs.whiteboard_1.0.0 [11]
>   "No bundles using service."
> 
> But the runtime DTO returns:
> {"serviceDTO":null, "defaultApplication":null, "applicationDTOs":[], 
> "failedResourceDTOs":[], "failedExtensionDTOs":[], "failedApplicationDTOs":[]}
> 
> 
> The log from my colleague has a lot more starting with 
> AriesJaxrsServiceRuntim:
> 15:42:52.941 [Start Level: Equinox Container: 
> cfe72d7c-4e6a-4892-94ae-9333da37a0ba] DEBUG 
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - Starting the whiteboard factory
> 15:42:53.020 [Start Level: Equinox Container: 
> cfe72d7c-4e6a-4892-94ae-9333da37a0ba] INFO  
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - Registered ClientBuilder
> 15:42:53.023 [Start Level: Equinox Container: 
> cfe72d7c-4e6a-4892-94ae-9333da37a0ba] INFO  
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - Registered SseEventSourceFactory
> 15:42:53.034 [Start Level: Equinox Container: 
> cfe72d7c-4e6a-4892-94ae-9333da37a0ba] DEBUG 
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - adding new whiteboard configuration: 
> {service.pid=org.apache.aries.jax.rs.whiteboard.default}
> 15:42:53.092 [Start Level: Equinox Container: 
> cfe72d7c-4e6a-4892-94ae-9333da37a0ba] INFO  
> o.a.a.j.r.w.a.CxfJaxrsBundleActivator - created whiteboard from 
> configuration: {service.pid=org.apache.aries.jax.rs.whiteboard.default}
> 15:42:53.142 [Start Level: Equinox Container: 
> cfe72d7c-4e6a-4892-94ae-9333da37a0ba] DEBUG 
> o.a.a.j.r.w.i.AriesJaxrsServiceRuntime - Registered service 
> CachingServiceReference {
> cachedProperties={osgi.jaxrs.name <http://osgi.jaxrs.name/>=.default, 
> osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)}
> serviceReference={javax.ws.rs.core.Application}={osgi.jaxrs.application.base=/,
>  service.id <http://service.id/>=79, service.bundleid=152, 
> service.scope=singleton, service.ranking=-2147483648, osgi.jaxrs.name 
> <http://osgi.jaxrs.name/>=.default, 
> osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default),
>  service.pid=org.apache.aries.jax.rs.whiteboard.default}
> } for name .default
> 15:42:53.159 [Start Level: Equinox Container: 
> cfe72d7c-4e6a-4892-94ae-9333da37a0ba] DEBUG o.a.a.j.r.w.i.Whiteboard - 
> Obtained instance from CachingServiceReference {
> cachedProperties={osgi.jaxrs.application.select=null (cached), 
> osgi.jaxrs.application.base=/, osgi.jaxrs.name 
> <http://osgi.jaxrs.name/>=.default, osgi.jaxrs.extension.select=null 
> (cached), osgi.http.whiteboard.context.select=null (cached), 
> osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default)}
> serviceReference={javax.ws.rs.core.Application}={osgi.jaxrs.application.base=/,
>  service.id <http://service.id/>=79, service.bundleid=152, 
> service.scope=singleton, service.ranking=-2147483648, osgi.jaxrs.name 
> <http://osgi.jaxrs.name/>=.default, 
> osgi.jaxrs.whiteboard.target=(service.pid=org.apache.aries.jax.rs.whiteboard.default),
>  service.pid=org.apache.aries.jax.rs.whiteboard.default}
> }
> 15:42:53.182 [Start Level: Equinox Container: 
> cfe72d7c-4e6a-4892-94ae-9333da37a0ba] DEBUG o.a.a.j.r.w.i.Whiteboard - 
> Creating CXF Bus with extensions {} and properties 
> {service.pid=org.apache.aries.jax.rs.whiteboard.default}
> 15:42:53.275 [Start Level: Equinox Container: 
> cfe72d7c-4e6a-4892-94ae-9333da37a0ba] DEBUG o.a.a.j.r.w.i.Whiteboard - 
> Created CXF Bus with extensions {} and properties 
> {service.pid=org.apache.aries.jax.rs.whiteboard.default}
> 
> Aries referenced bundles
>     11|Active     |    4|Apache Aries JAX-RS Whiteboard (1.0.0)
>     65|Active     |    4|Apache Aries JAX-RS Specification API (1.0.0)
>    103|Active     |    4|Apache Aries Quiesce API (1.0.0)
>    145|Active     |    4|Apache Aries SPI Fly Dynamic Weaving Bundle (1.0.12)
>    149|Active     |    4|Apache Aries Blueprint Core (1.9.0)
>    183|Active     |    4|Apache Aries Proxy API (1.1.0)
>    228|Active     |    4|org.apache.aries.component-dsl.component-dsl (1.2.0)
>    288|Active     |    4|Apache Aries Blueprint API (1.0.1)
>    343|Active     |    4|Apache Aries Util (1.0.0)
> 
> Any ideas?
> 
> Thanks
> Alain
> 
> _______________________________________________
> 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