Hello

I've checked
org.ops4j.pax.web.extender.whiteboard.internal.tracker.ServletTracker#createWebElement()
and indeed - it takes "alias" from "alias" property and may take patterns
from "urlPatterns" or "osgi.http.whiteboard.servlet.pattern" - but you
CAN'T specify "alias" property to do it.

Please don't use:

props.put(ExtenderConstants.PROPERTY_ALIAS, "/hello");

regards
Grzegorz

czw., 6 lut 2020 o 13:07 Miroslav Beranič <[email protected]>
napisał(a):

> Hi JB,
>
> Took the code from:
> https://github.com/ops4j/org.ops4j.pax.web/tree/master/samples/whiteboard
>
> to be able to use ExtenderConstants.PROPERTY_HTTP_CONTEXT_ID => Virtual
> hosts "feature" of Jetty.
>
> {
>     Dictionary<String, Object> props;
>     props = new Hashtable<>();
>
>     props.put(ExtenderConstants.PROPERTY_ALIAS, "/hello");
>     props.put(ExtenderConstants.PROPERTY_HTTP_CONTEXT_ID, "virtualhost");
>
>     // Fail with Exception: from inside constructor of class
> org.ops4j.pax.web.extender.whiteboard.internal.element.ServletWebElement
>     // props.put(ExtenderConstants.PROPERTY_URL_PATTERNS, "/hello");
>
>     props.put(ExtenderConstants.DEFAULT_INIT_PREFIX_PROP +
> "exactUrlPattern", Boolean.TRUE);
>
>     servletReg = bundleContext.registerService(Servlet.class, new
> WhiteboardServlet("/hello"), props);
> }
>
> Kind Regards,
> Miroslav
>
>
> Dne četrtek, 06. februar 2020 12.50.17 UTC+1 je oseba Jean-Baptiste Onofré
> napisala:
>>
>> 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č <[email protected]>
>> 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 - [email protected]
>>>
>>> ---
>>> 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 [email protected].
>>> 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 - [email protected]
>
> ---
> 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 [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ops4j/9016e27b-4059-4c2d-83ad-1ae42d5083c5%40googlegroups.com
> <https://groups.google.com/d/msgid/ops4j/9016e27b-4059-4c2d-83ad-1ae42d5083c5%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
-- 
------------------
OPS4J - http://www.ops4j.org - [email protected]

--- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ops4j/CAAdXmhoCKVNaxKmy51dWFE2uMBmSbSZHBKb3azGJ9PwJ%2BrPVGg%40mail.gmail.com.

Reply via email to