Hmm

In Pax Web 8+, all resource access methods from resource servlets
(JettyResourceServlet, TomcatResourceServlet, UndertowResourceServlet) are
handled by javax.servlet.ServletContext#getResource() call - whether it's
WAB, HttpService or Whiteboard.

In WAB, this is delegated to
org.ops4j.pax.web.extender.war.internal.WebApplicationHelper#getResource()
and org.osgi.framework.Bundle#findEntries() - but if not found,
META-INF/resources are checked (including fragments).
Mind that org.osgi.framework.Bundle#findEntries() method considers
fragments as well.

In Whiteboard, however by default (see
https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#d0e119637)
org.osgi.framework.Bundle#getEntry() method is used (not
Bundle#findEntries()), which *doesn't check fragments*. See default
implementation of org.osgi.service.http.context.ServletContextHelper.

This is confusing and unintuitive.

However you could register your own
org.osgi.service.http.context.ServletContextHelper with changed
org.osgi.service.http.context.ServletContextHelper#getResource() method
that uses Bundle#findEntries() instead of Bundle#getEntry() - it should
work ;)

regards
Grzegorz Grzybek

śr., 11 sty 2023 o 14:31 Jochen Walz <[email protected]>
napisał(a):

> Hello Grzegorz,
>
> The WAB approach works - even with the HTML files located under the
> bundle's root directory.
>
> For the whiteboard approach: I only have one resource service class in my
> "main" help bundle, i.e., the host bundle, no additional services in the
> fragment bundles. Of course, using the same resource pattern multiple times
> would create a conflict. My assumption was, since the resource service can
> serve the HTML files from the host bundle, it will also use the files from
> the fragment bundles, because they share the same class loader. Obviously,
> this assumption was wrong.
>
> So, I searched for an example where somebody has solved that, e.g., by
> searching for resources in all attached fragment bundles and make them
> available to the resource servlet. Possibly in the activate method of the
> resource service. In a similar way as the pax-web-extender-war does it, but
> of course much simpler, because there is no need to look  for Web
> applications, only few folders with resource files.
>
> If such example doesn't exist, I either must try myself, or just accept a
> bit of "overweight" and continue using WAB.
>
> Regards
> Jochen
>
> Am 11. Januar 2023 12:28:35 MEZ schrieb Grzegorz Grzybek <
> [email protected]>:
>>
>> Hello
>>
>> With Pax Web 8, fragment bundles attached to WAB are searched for
>> "META-INF/resources/" resource - each such resource is added to WAB
>> resource path. See for example
>> https://github.com/ops4j/org.ops4j.pax.web/tree/web-8.0.15/samples/samples-war/war-required/src/main/resources/META-INF
>>
>> samples/samples-war/war-required and samples/samples-war/war-requiring
>> are _wired_ using Require-Bundle relationship, but normal fragment should
>> also work.
>>
>> Mind that "META-INF/resources" is the recommended approach, specified in
>> Servlet API specification and handled fully in Pax Web 8+.
>>
>> Whiteboard is not an implementation of Web Application specification and
>> while bundles can register Whiteboard services into the same target web
>> context, it's not possible that two bundles register resources for the same
>> mapping to create kind of _overlay_.
>>
>> regards
>> Grzegorz Grzybek
>>
>> śr., 11 sty 2023 o 11:03 Jochen Walz <[email protected]>
>> napisał(a):
>>
>>> Hi,
>>>
>>> With Karaf 4.3.6 / Pax Web 7.3.23, I had used a WAB to provide some HTML
>>> files for online help, and - depending on the parts of my application which
>>> are installed - fragment bundles with additional help files. The war
>>> feature handled that correctly.
>>>
>>> With Karaf 4.4.2, I wanted to switch to using the
>>> pax-web-http-whiteboard, providing a resource service in my main help
>>> bundle with appropriate settings for HTTP_WHITEBOARD_RESOURCE_PATTERN and
>>> HTTP_WHITEBOARD_RESOURCE_PREFIX. Looks bit more lightweight than a WAB.
>>>
>>> The HTML files from my main help bundle are served correctly, but not
>>> the ones from the fragment bundles.
>>>
>>> So: does somebody know an (easy) way to make resources in fragment
>>> bundles visible for the resource service, assumed that all fragments are
>>> already installed when the bundle with the resource service is started?
>>> Possibly some example exists somewhere. Or would that lead so far that it
>>> is by far easier to just keep the WAB approach with the pax-web-war feature?
>>>
>>> Thanks & Regards,
>>> Jochen
>>>
>>

Reply via email to