Hi

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

> ... and with the custom ServletContextHelper, it works. Thanks for the
> hint!
>

I'm glad Pax Web 8 is prepared for such scenarios ;)

regards
Grzegorz Grzybek


>
> Regards
> Jochen
>
>
> Am 11. Januar 2023 14:47:42 MEZ schrieb Grzegorz Grzybek <
> [email protected]>:
>>
>> 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