Hello

Somehow I thought you're using Pax Web 8 which actually has working context
selection. Problems with context registration/selection were the MAIN
reason I started refactoring of Pax Web 7 into Pax Web 8.

Your example is _canonical_ example of Whiteboard usage and should work
perfectly fine with Pax Web 8 (included in Karaf 4.4.3).

regards
Grzegorz Grzybek

wt., 14 lut 2023 o 02:54 Andrew Lienhard <andrew.lienh...@gmail.com>
napisał(a):

> Hi. Thanks for taking the time to respond. I managed to get it working
> using the API example you provided. I had a problem with the context aspect
> though so I just mapped the path of the resources to include what would
> have been the new context path. It looks like it always runs under the
> default "/" context setup in the unomi wab. In the end, I just needed the
> path, not anything specific to a servlet context since it's just a static
> website.
>
> I'm including some logs/code to show the issue with attaching the context,
> if you have any ideas. But the good news is that I was able to get the path
> stuff sorted out for the static files by simply not using it.
>
> *Code:*
>
> private static final String MY_CONTEXT_NAME = "my-context";
>
>  /**
>    * Registers a custom web context for use with this endpoint.
>    *
>    * @param context
>    */
>   private void registerCustomContext(BundleContext context) {
>     Dictionary<String, String> contextProps = new Hashtable<>();
>
> contextProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME,
> MY_CONTEXT_NAME);
>     contextProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH,*
> "/test" * );
>     context.registerService(ServletContextHelper.class, new
> ServletContextHelper () {}, contextProps);
>     log.info("ContextInitializer registered a new context {}",
> contextProps);
>   }
>
>   /**
>    * Registers a static resource service.
>    *
>    * @param context
>    */
>   private void registerCustomResource(BundleContext context) {
>     Dictionary<String, Object> resourceProps = new Hashtable<>();
>
> resourceProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PATTERN,
> new String[] {"/static/*"});
>
> resourceProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PREFIX,
> "/webapp/files");
>     resourceProps.put(
>         HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT,
>         String.format("(%s=%s)",
> HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME,  MY_CONTEXT_NAME   ));
>
>     context.registerService(Object.class, new Object(), resourceProps);
>     log.info("ContextInitializer registered a new resource {}",
> resourceProps);
>   }
>
>   // blueprint.xml init-method="initConfig"
>   public void initConfig() {
>     BundleContext bundleContext =
> FrameworkUtil.getBundle(ContextInitializer.class).getBundleContext();
>     this.registerCustomContext(bundleContext);
>     this.registerCustomResource(bundleContext);
>   }
>
> Custom context: /test
> Resource mapping: /static/* -> /webapp/files
> Request: /test/static/hello.txt
>
> *Logs:*
>
>           | 2023-02-13T21:15:08,785 | DEBUG | qtp707116334-265 |
> ServerModel                      | 251 - org.ops4j.pax.web.pax-web-spi -
> 7.2.14 | Matching *[/test/static/hello.txt*]...
>           | 2023-02-13T21:15:08,785 | DEBUG | qtp707116334-265 |
> ServerModel                      | 251 - org.ops4j.pax.web.pax-web-spi -
> 7.2.14 | Path [ /test/static/hello.txt] *does not match any context*
>           | 2023-02-13T21:15:08,785 | DEBUG | qtp707116334-265 |
> HttpServiceContext               | 248 - org.ops4j.pax.web.pax-web-jetty -
> 7.2.14 | Handling request for [ /test/static/hello.txt]* using http
> context [DefaultHttpContext [bundle=org.apache.cxf.cxf-rt-transports-http
> [112], contextID=default]]*
>          | 2023-02-13T21:15:08,785 | DEBUG | qtp707116334-265 |
> HttpServiceServletHandler        | 248 - org.ops4j.pax.web.pax-web-jetty -
> 7.2.14 | handling request
> org.ops4j.pax.web.service.jetty.internal.HttpServiceRequestWrapper@3d9340e9,
> org.ops4j.pax.web.service.jetty.internal.HttpServiceResponseWrapper@6f53a229
>          | 2023-02-13T21:15:08,786 | DEBUG | qtp707116334-265 |
> DefaultHttpContext               | 250 - org.ops4j.pax.web.pax-web-runtime
> - 7.2.14 | Searching bundle [org.apache.cxf.cxf-rt-transports-http [112]]* for
> resource [ test/static/hello.txt]*
>
> In the system console (Felix) I see the  ServletContextHelper and the
> resource registered accordingly
>
> [org.osgi.service.http.context.ServletContextHelper]
> osgi.http.whiteboard.context.name my-context
> osgi.http.whiteboard.context.path /test
> service.bundleid 56
> service.scope singleton
>
>
> [Object]
> osgi.http.whiteboard.context.select (osgi.http.whiteboard.context.name
> =my-context)
> osgi.http.whiteboard.resource.pattern /static/*
> osgi.http.whiteboard.resource.prefix /webapp/files
> service.bundleid 56
> service.scope singleton
> Using Bundles org.ops4j.pax.web.pax-web-extender-whiteboard (247)
> <http://localhost:8181/cdp-server/system/console/bundles//247>
>
>
> On Mon, Feb 13, 2023 at 12:58 AM Grzegorz Grzybek <gr.grzy...@gmail.com>
> wrote:
>
>> Hello
>>
>> If you need only static resources, maybe you should simply register
>> Whiteboard-based resources? Something like this:
>>
>> register a context to "get" a context path:
>>
>> Dictionary<String, Object> properties = new Hashtable<>();
>> properties.put("osgi.http.whiteboard.context.name", "my-context");
>> properties.put("osgi.http.whiteboard.context.path", "/sample");
>>
>> ServiceRegistration<ServletContextHelper> reg =
>> context.registerService(ServletContextHelper.class, new
>> ServletContextHelper() {}, properties);
>>
>> register resources into this context path:
>>
>> Dictionary<String, Object> properties = new Hashtable<>();
>> properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PATTERN,
>> new String[] { "/static/*" });
>> properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PREFIX,
>> "/resources");
>> properties.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT,
>> String.format("(%s=my-context)",
>> HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME));
>>
>> ServiceRegistration<Object> resReg =
>> context.registerService(Object.class, new Object(), properties);
>>
>> Then you'll be able to get resources from bundle's "/resources" directory
>> using URI's like "/sample/static/*"
>>
>> But sure - your WAR approach should work too.
>>
>> regards
>> Grzegorz Grzybek
>>
>> pon., 13 lut 2023 o 04:49 Andrew Lienhard <andrew.lienh...@gmail.com>
>> napisał(a):
>>
>>> This seems to be the most promising approach. Repackage the WAB as a WAR
>>> then deploy it at runtime as shown below. The URL parameters will assist
>>> the OSGI Web URL Handler in automagically producing a WAB + MANIFEST.MF
>>> with the correct web-contextpath header. Only I need to do it using the
>>> bundleContext.installBundle(String location) API instead of in the console.
>>> I also need to sort out the URL of the built war itself. Does this sound
>>> correct?
>>>
>>>
>>>
>>> karaf@root()> bundle:install -s "webbundle:
>>> http://tomcat.apache.org/tomcat-7.0-doc/appdev/sample/sample.war?Bundle-SymbolicName=tomcat-sample&Web-ContextPath=/sample
>>> "
>>>
>>>
>>>
>>> From <https://karaf.apache.org/manual/latest/webcontainer>
>>>
>>>
>>> https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.war.html#i3100445
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Sun, Feb 12, 2023 at 4:29 PM Andrew Lienhard <alienh...@gmail.com>
>>> wrote:
>>>
>>>> I have a WAB in a karaf container that I need to deploy using a context
>>>> path based on environment variables (k8s helm). Currently its
>>>> web-ContextPath is hardcoded in a pom.xml, so it's compile-time only which
>>>> won't work for our deployments.
>>>>
>>>> I'm wondering if it's possible to register this WAB dynamically as one
>>>> would a servlet using HttpService and/or pax-web. I've been digging through
>>>> the documentation and examples but so far I haven't been able to work it
>>>> out. Is this doable? If so, are there any examples of this? Ultimately, I
>>>> don't care what form the service takes as long as it can serve static files
>>>> from a directory.
>>>>
>>>> clip from the pom.xml
>>>>       <plugin>
>>>>                 <groupId>org.apache.felix</groupId>
>>>>                 <artifactId>maven-bundle-plugin</artifactId>
>>>>                 <extensions>true</extensions>
>>>>                 <configuration>
>>>>                     <instructions>
>>>>                         <_wab>src/main/webapp</_wab>
>>>>
>>>> <Include-Resource>{maven-resources},OSGI-INF/blueprint/blueprint.xml=${project.build.directory}/classes/OSGI-INF/blueprint/blueprint.xml</Include-Resource>
>>>>
>>>> <Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
>>>>                         <Embed-Directory>WEB-INF/lib</Embed-Directory>
>>>>                         <Web-ContextPath>/</Web-ContextPath>
>>>>                     </instructions>
>>>>                 </configuration>
>>>>             </plugin>
>>>>
>>>> --
>>>> --
>>>> ------------------
>>>> OPS4J - http://www.ops4j.org - ops4j@googlegroups.com
>>>>
>>>> ---
>>>> You received this message because you are subscribed to the Google
>>>> Groups "OPS4J" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to ops4j+unsubscr...@googlegroups.com.
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/ops4j/2e75aacf-be77-4753-a05c-126df2b7f487n%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/ops4j/2e75aacf-be77-4753-a05c-126df2b7f487n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> --
>>> --
>>> ------------------
>>> OPS4J - http://www.ops4j.org - ops4j@googlegroups.com
>>>
>>> ---
>>> You received this message because you are subscribed to the Google
>>> Groups "OPS4J" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to ops4j+unsubscr...@googlegroups.com.
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/ops4j/CADGfNtp_02pRaMrG7Oj0wJuYKA3O3p0QS6DHa3XSChA0qJNUFA%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/ops4j/CADGfNtp_02pRaMrG7Oj0wJuYKA3O3p0QS6DHa3XSChA0qJNUFA%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>> --
>> --
>> ------------------
>> OPS4J - http://www.ops4j.org - ops4j@googlegroups.com
>>
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "OPS4J" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to ops4j+unsubscr...@googlegroups.com.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/ops4j/CAAdXmhpzREW99MVkkyXxg8Bt8Owsyp-iYY26n%2BeiG3F4BEn_eg%40mail.gmail.com
>> <https://groups.google.com/d/msgid/ops4j/CAAdXmhpzREW99MVkkyXxg8Bt8Owsyp-iYY26n%2BeiG3F4BEn_eg%40mail.gmail.com?utm_medium=email&utm_source=footer>
>> .
>>
> --
> --
> ------------------
> OPS4J - http://www.ops4j.org - ops4j@googlegroups.com
>
> ---
> You received this message because you are subscribed to the Google Groups
> "OPS4J" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to ops4j+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ops4j/CADGfNtqNM-x5B0XTrK2Vgo%2BdDwsB7erxhgVqKC7KrAth%2B%2BaesA%40mail.gmail.com
> <https://groups.google.com/d/msgid/ops4j/CADGfNtqNM-x5B0XTrK2Vgo%2BdDwsB7erxhgVqKC7KrAth%2B%2BaesA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
-- 
------------------
OPS4J - http://www.ops4j.org - ops4j@googlegroups.com

--- 
You received this message because you are subscribed to the Google Groups 
"OPS4J" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to ops4j+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ops4j/CAAdXmhoj19T%2B65q1NpLYLwCbgPO1%3DShD8xxXj0yhHbi5vCYmNw%40mail.gmail.com.

Reply via email to