Hi

Can you please share how you register the servlet ? Via the
httpService.register, Servlet service registration or whiteboard ?

Thanks,
Regards
JB

On Thu, Feb 6, 2020 at 12:14 PM Miroslav Beranič <
miroslav.bera...@mibesis.si> wrote:

> Hi all,
>
> I work with Pax Web on Karaf 4.3.0. I am trying to register Servlet with
> exact url, but I see url pattern is auto-generated from alias.
> I look at the current master branch - version 8.0.0-SNAPSHOT. Class:
>
> org.ops4j.pax.web.service.spi.model.ServletModel
>
>
> constructor:
> #ServletModel(org.ops4j.pax.web.service.spi.model.ContextModel,
> javax.servlet.Servlet, java.lang.String, java.lang.String[],
> java.lang.String, java.util.Dictionary<java.lang.String,?>,
> java.lang.Integer, java.lang.Boolean, javax.servlet.MultipartConfigElement)
>
>
> it calles method ( private static )
> new String[]{aliasAsUrlPattern(alias)}
>
>
>     private static String aliasAsUrlPattern(final String alias) {
>         String urlPattern = alias;
>         if (urlPattern != null && !urlPattern.equals("/")
>                 && !urlPattern.contains("*")) {
>             if (urlPattern.endsWith("/")) {
>                 urlPattern = urlPattern + "*";
>             } else {
>                 urlPattern = urlPattern + "/*";
>             }
>         }
>         return urlPattern;
>     }
>
>
> so it always creates a url pattern, as I guess the name suggest, but why?
> I would like to register exact URL, not the pattern. As it looks now, this
> is not possible to do - as there is no argument to pass in to control the
> flow.
>
> As it looks from the git history/log this is quite "old" code - from 2008
> - 2013, so I guess this is not new and I guess everybody are ok with this?
> So in this case, what is the usecase for it? As for my usecase - this is
> not the required behavior.
>
> For example, Servlet, registered with /hello, also matches /hello/1, but I
> want /hello/1 to return HTTP 404.
>
>
> So for now, only really question is - is this expected behavior or is
> there a room to change this? If so, how can one, with existing solution,
> register Servlet with exact URL?
>
> Exact strack of calls looks like this:
>
> <init>:53, ServletModel (org.ops4j.pax.web.service.spi.model)
> registerServlet:224, HttpServiceStarted
> (org.ops4j.pax.web.service.internal)
> registerServlet:210, HttpServiceStarted
> (org.ops4j.pax.web.service.internal)
> registerServlet:69, HttpServiceProxy (org.ops4j.pax.web.service.internal)
> register:97, ServletWebElement
> (org.ops4j.pax.web.extender.whiteboard.internal.element)
> registerWebElement:392, WebApplication
> (org.ops4j.pax.web.extender.whiteboard.internal)
> addWebElement:188, WebApplication
> (org.ops4j.pax.web.extender.whiteboard.internal)
> addingService:193, AbstractTracker
> (org.ops4j.pax.web.extender.whiteboard.internal.tracker)
> addingService:46, AbstractTracker
> (org.ops4j.pax.web.extender.whiteboard.internal.tracker)
> customizerAdding:941, ServiceTracker$Tracked (org.osgi.util.tracker)
> customizerAdding:870, ServiceTracker$Tracked (org.osgi.util.tracker)
> trackAdding:256, AbstractTracked (org.osgi.util.tracker)
> track:229, AbstractTracked (org.osgi.util.tracker)
> serviceChanged:901, ServiceTracker$Tracked (org.osgi.util.tracker)
> invokeServiceListenerCallback:990, EventDispatcher
> (org.apache.felix.framework)
> fireEventImmediately:838, EventDispatcher (org.apache.felix.framework)
> fireServiceEvent:545, EventDispatcher (org.apache.felix.framework)
> fireServiceEvent:4595, Felix (org.apache.felix.framework)
> registerService:3587, Felix (org.apache.felix.framework)
> registerService:348, BundleContextImpl (org.apache.felix.framework)
> registerService:355, BundleContextImpl (org.apache.felix.framework)
>
> I've changed this in my branch, added additional method with same name and
> initParams:
>
> private static String aliasAsUrlPattern(final String alias, final
> Dictionary<String, ?> initParams) {
>    final Object exactUrlPatternFromAliasParam =
> initParams.get("exactUrlPattern");
>    Boolean exactUrlPatternFromAlias = Boolean.FALSE;
>    if (null != exactUrlPatternFromAliasParam) {
>       if (exactUrlPatternFromAliasParam instanceof String) {
>          final String flag = ((String)
> exactUrlPatternFromAliasParam).toLowerCase();
>          exactUrlPatternFromAlias = Boolean.parseBoolean(flag);
>        } else if(exactUrlPatternFromAliasParam instanceof Boolean) {
>          final Boolean flag = (Boolean) exactUrlPatternFromAliasParam;
>          exactUrlPatternFromAlias = flag;
>       } else if (exactUrlPatternFromAliasParam instanceof Serializable) {
>          final String flag =
> exactUrlPatternFromAliasParam.toString().toLowerCase();
>          exactUrlPatternFromAlias = Boolean.parseBoolean(flag);
>        }
>    }
>    final String result;
>    if (Boolean.TRUE.equals(exactUrlPatternFromAlias)) {
>       // Break the reference
>       result = alias.toString();
>    } else {
>       result = aliasAsUrlPattern(alias);
>    }
>    return result;
> }
>
>
> This calls original unmodified version of method aliasAsUrlPattern.
>
> Caller has to pass additional init parameter "exactUrlPattern". I usually
> call it with Boolean.TRUE. I guess flag could/should be added into
> org.ops4j.pax.web.extender.whiteboard.ExtenderConstants.
>
> To note one other thing -- this is " one of the use cases ", I as see
> there is also construction, that allows to pass in defined url patterns,
> but I did not find how to call it. The call I am using is:
>
> props.put(ExtenderConstants.DEFAULT_INIT_PREFIX_PROP + "exactUrlPattern",
> Boolean.TRUE);
> bundleContext.registerService(Servlet.class, new
> WhiteboardServlet("/hello"), props);
>
> Could be, that if HttpService interface is used, this is not the case.
>
> I've tried to solve this using
>
> props.put(ExtenderConstants.PROPERTY_URL_PATTERNS, "/hello");
>
> This is illegal state as implemented by the constructor of class:
>
> org.ops4j.pax.web.extender.whiteboard.internal.element.ServletWebElement
>
> if (alias != null && urlPatterns != null && urlPatterns.length != 0) {
>     LOG.warn("Registered servlet [{}] cannot have both alias and url
> patterns.", getServiceID());
>     valid = false;
> }
>
>
> I did not look into this yet, but why is this implemented like so? If this
> would be changed, it would make use of existing constants.
>
>
> Kind Regards,
> Miroslav
>
>
> --
> --
> ------------------
> 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/179c33ab-fdd3-451f-b4ff-57f2fc934a04%40googlegroups.com
> <https://groups.google.com/d/msgid/ops4j/179c33ab-fdd3-451f-b4ff-57f2fc934a04%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/CAB8EV3QmBn9g%2BZOK9Lvz0vOX9bBgF44FHEN0HYU%3DXv%3DiyvdQiQ%40mail.gmail.com.

Reply via email to