You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@karaf.apache.org by Steinar Bang <sb...@dod.no> on 2018/06/16 16:31:39 UTC

Web whiteboard: use whiteboard context instead of alias for servlet

I'm trying to replace alias with web context for a whiteboard servlet
started with DS.  I tried to copy-paste an example that works and edit
it as needed.

However the end result didn't work (I just got 404 on the path), and I
wonder where I went wrong...?

I have this servlet that works, ie. I get the expected results on
"/ukelonn/*":
@Component(
    property= {
        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN+"=/*",
        HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME +"=ukelonn)",
        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME+"=ukelonn"},
    service=VaadinServlet.class,
    immediate=true
)
public class UkelonnServlet extends TouchKitServlet {
  ...
}

(it sort of works if the service is Servlet.class as well, just not as
well)

So I have this:
@Component(service={Servlet.class}, property={"alias=/frontend-karaf-demo"} )
public class ReactServlet extends HttpServlet {
   ...
}

and tried replacing this with:
@Component(
    property= {
        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN+"=/*",
        HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME +"=frontend-karaf-demo)",
        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME+"=frontend-karaf-demo"},
    service=Servlet.class,
    immediate=true
)
public class ReactServlet extends HttpServlet {
   ...
}

But that just gave me 404 on /frontend-karaf-demo and
/frontend-karaf-demo/

So where did I go wrong?

Thanks!


Re: Web whiteboard: use whiteboard context instead of alias for servlet

Posted by Steinar Bang <sb...@dod.no>.
>>>>> Łukasz Dywicki <lu...@code-house.org>:

> I see in your code examples servlets but I can not see HttpContext
> instance. You specify org.osgi.service.http.HttpContext to be
> different than default but do not register service which have such id.

Yes, my bad!

I didn't remember exactly how I got the code I was copy pasting from
 working, and didn't google myself well enough before asking the question:
 https://groups.google.com/d/msg/ops4j/Y8YwekymQ-Q/VF6QhzJSBgAJ

Luckily I wrote it all down...:-)

The ops4j mailing list message from 31 March this year, explains what
my copy-pasted code needed, probably step 1, the ServletContextHelper...?

Thanks!


- Steinar


Re: Web whiteboard: use whiteboard context instead of alias for servlet

Posted by Steinar Bang <sb...@dod.no>.
>>>>> Tim Ward <ti...@paremus.com>:

> The OSGi Http Whiteboard requires your service to be registered as a
> javax.servlet.Servlet. In your code snippet you register it as a
> VaadinServlet, which is not part of the spec. My guess is that this is
> either being handled by a Vaadin component somehow, or that the PAX
> Web container goes beyond the limits of the OSGi spec.

You're right!  The VaadinServlet service is probably handled by the
Vaadin framework somehow.  In some ways it behaves as a whiteboard
servlet so Vaadin probably plays by the rules there, but there is a lot
of other magic stuff going on.

> The next thing to comment on is that the servlet is targeting a
> specific Context. You can see what this means in the section about
> Common Whiteboard Properties
> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#service.http.whiteboard.common.properties>,
> but in essence your servlet is ineligible to run unless a Servlet
> Context exists with the name "frontend-karaf-demo”.

Right! Creating such a context would be the first step of this message I
wrote to the OPS4J mailing list on 31 March this year? Ie. the
ServletContextHelper component?
 https://groups.google.com/d/msg/ops4j/Y8YwekymQ-Q/VF6QhzJSBgAJ

(life would be so much simpler if I could just remember everything I did
a couple of months back...:-) )

> You can see how to register a custom Context using Servlet Context
> Properties
> <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#service.http.whiteboard.servletcontext.helper.properties>,
> but my question to you is “do you actually need a custom context?”. If
> you remove the context selection filter and use a servlet pattern of
> “/frontend-karaf-demo/*” then you should get a servlet listening on
> the correct path.

That's what I ended up doing for the karaf-frontend-demo.
 https://github.com/steinarb/frontend-karaf-demo

The reason ukelonn had a servlet context was that it was using an apache
shiro filter in front of the servlet to do authentication and
authorization:
 https://github.com/steinarb/ukelonn

Also the VAADIN static resources worked a lot better with a context,
because that let me serve two Vaadin applications from the same jetty
instance when they were based on different Vaadin versions (if I didn't
use a context Vaadin would look for resources at /VAADIN, with a context
Vaadin would look for resources at /ukelonn/VAADIN)

Thanks!


- Steinar


Re: Web whiteboard: use whiteboard context instead of alias for servlet

Posted by Tim Ward <ti...@paremus.com>.
Hi Steinar,

The OSGi Http Whiteboard requires your service to be registered as a javax.servlet.Servlet. In your code snippet you register it as a VaadinServlet, which is not part of the spec. My guess is that this is either being handled by a Vaadin component somehow, or that the PAX Web container goes beyond the limits of the OSGi spec.

The next thing to comment on is that the servlet is targeting a specific Context. You can see what this means in the section about Common Whiteboard Properties <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#service.http.whiteboard.common.properties>, but in essence your servlet is ineligible to run unless a Servlet Context exists with the name "frontend-karaf-demo”.

You can see how to register a custom Context using Servlet Context Properties <https://osgi.org/specification/osgi.cmpn/7.0.0/service.http.whiteboard.html#service.http.whiteboard.servletcontext.helper.properties>, but my question to you is “do you actually need a custom context?”. If you remove the context selection filter and use a servlet pattern of “/frontend-karaf-demo/*” then you should get a servlet listening on the correct path.

Best Regards,

Tim


> On 17 Jun 2018, at 09:18, Łukasz Dywicki <lu...@code-house.org> wrote:
> 
> Hey,
> I see in your code examples servlets but I can not see HttpContext instance. You specify org.osgi.service.http.HttpContext to be different than default but do not register service which have such id.
> 
> Cheers,
> Łukasz
> --
> Code-House
> http://code-house.org
> 
>> On 16 Jun 2018, at 18:31, Steinar Bang <sb...@dod.no> wrote:
>> 
>> I'm trying to replace alias with web context for a whiteboard servlet
>> started with DS.  I tried to copy-paste an example that works and edit
>> it as needed.
>> 
>> However the end result didn't work (I just got 404 on the path), and I
>> wonder where I went wrong...?
>> 
>> I have this servlet that works, ie. I get the expected results on
>> "/ukelonn/*":
>> @Component(
>>   property= {
>>       HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN+"=/*",
>>       HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME +"=ukelonn)",
>>       HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME+"=ukelonn"},
>>   service=VaadinServlet.class,
>>   immediate=true
>> )
>> public class UkelonnServlet extends TouchKitServlet {
>> ...
>> }
>> 
>> (it sort of works if the service is Servlet.class as well, just not as
>> well)
>> 
>> So I have this:
>> @Component(service={Servlet.class}, property={"alias=/frontend-karaf-demo"} )
>> public class ReactServlet extends HttpServlet {
>>  ...
>> }
>> 
>> and tried replacing this with:
>> @Component(
>>   property= {
>>       HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN+"=/*",
>>       HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME +"=frontend-karaf-demo)",
>>       HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME+"=frontend-karaf-demo"},
>>   service=Servlet.class,
>>   immediate=true
>> )
>> public class ReactServlet extends HttpServlet {
>>  ...
>> }
>> 
>> But that just gave me 404 on /frontend-karaf-demo and
>> /frontend-karaf-demo/
>> 
>> So where did I go wrong?
>> 
>> Thanks!
>> 


Re: Web whiteboard: use whiteboard context instead of alias for servlet

Posted by Łukasz Dywicki <lu...@code-house.org>.
Hey,
I see in your code examples servlets but I can not see HttpContext instance. You specify org.osgi.service.http.HttpContext to be different than default but do not register service which have such id.

Cheers,
Łukasz
--
Code-House
http://code-house.org

> On 16 Jun 2018, at 18:31, Steinar Bang <sb...@dod.no> wrote:
> 
> I'm trying to replace alias with web context for a whiteboard servlet
> started with DS.  I tried to copy-paste an example that works and edit
> it as needed.
> 
> However the end result didn't work (I just got 404 on the path), and I
> wonder where I went wrong...?
> 
> I have this servlet that works, ie. I get the expected results on
> "/ukelonn/*":
> @Component(
>    property= {
>        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN+"=/*",
>        HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME +"=ukelonn)",
>        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME+"=ukelonn"},
>    service=VaadinServlet.class,
>    immediate=true
> )
> public class UkelonnServlet extends TouchKitServlet {
>  ...
> }
> 
> (it sort of works if the service is Servlet.class as well, just not as
> well)
> 
> So I have this:
> @Component(service={Servlet.class}, property={"alias=/frontend-karaf-demo"} )
> public class ReactServlet extends HttpServlet {
>   ...
> }
> 
> and tried replacing this with:
> @Component(
>    property= {
>        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN+"=/*",
>        HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT + "=(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME +"=frontend-karaf-demo)",
>        HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME+"=frontend-karaf-demo"},
>    service=Servlet.class,
>    immediate=true
> )
> public class ReactServlet extends HttpServlet {
>   ...
> }
> 
> But that just gave me 404 on /frontend-karaf-demo and
> /frontend-karaf-demo/
> 
> So where did I go wrong?
> 
> Thanks!
>